identical queries performing differently? - Mailing list pgsql-admin

From kaolin fire
Subject identical queries performing differently?
Date
Msg-id D0AE5DD0-EB2D-11D8-9A03-000A957FF036@tentacle.net
Whole thread Raw
List pgsql-admin
Any help on the below would be greatly appreciated.  Two identical
queries on two nearly-identical setups (the slower query is happening
on a slower box, but not by anything close to the disparity between the
two: 167ms in analyze versus 70000 ms in analyze).


      Table "public.status"
   Column  |  Type   | Modifiers
----------+---------+-----------
  objectid | integer |
  status   | integer |
  stamp    | date    |
  type     | integer |
  id       | integer |
Indexes: status_idx btree (id, objectid, status),
          status_statustypestamp_idx btree (status, stamp, "type")

explain analyze select objectid from status where type = 54 and status
= 61 except select distinct s1.objectid from status s1, status s2 where
s1.type = 54 and s2.type = 54 and s1.objectid = s2.objectid and
s1.status = 61 and s2.status != 61 and s2.id > s1.id;

The slower one is 7.3.4, the quicker one is 7.3.2.

I don't see any significant differences between the two
postgresql.conf's other than the defaults are commented out (but not
replaced with anything) in one of the files (so I presume they're still
defaulted...?  would that be correct?  to whit:

< #max_fsm_relations = 1000     # min 10, fsm is free space map, ~40
bytes
< #max_fsm_pages = 10000                # min 1000, fsm is free space
map, ~6 bytes
< #max_locks_per_transaction = 64       # min 10
< #wal_buffers = 8              # min 4, typically 8KB each
---
 > max_fsm_relations = 1000      # min 10, fsm is free space map, ~40
bytes
 > max_fsm_pages = 10000         # min 1000, fsm is free space map, ~6
bytes
 > max_locks_per_transaction = 64        # min 10
 > wal_buffers = 8               # min 4, typically 8KB each
61c61
< sort_mem = 1024               # min 64, size in KB
---
 > #sort_mem = 1024              # min 64, size in KB
74c74

------------------------------------------------------------------------
------------------------------------------------------------------------
-----------------------------------------
  SetOp Except  (cost=7439.38..7439.40 rows=1 width=16) (actual
time=167.72..168.59 rows=4 loops=1)
    ->  Sort  (cost=7439.38..7439.39 rows=5 width=16) (actual
time=167.48..167.91 rows=1718 loops=1)
          Sort Key: objectid
          ->  Append  (cost=0.00..7439.32 rows=5 width=16) (actual
time=0.14..165.83 rows=1718 loops=1)
                ->  Subquery Scan "*SELECT* 1"  (cost=0.00..2138.53
rows=4 width=4) (actual time=0.14..7.66 rows=861 loops=1)
                      ->  Index Scan using status_statustypestamp_idx on
status  (cost=0.00..2138.53 rows=4 width=4) (actual time=0.13..6.93
rows=861 loops=1)
                            Index Cond: (status = 61)
                            Filter: ("type" = 54)
                ->  Subquery Scan "*SELECT* 2"  (cost=5300.77..5300.80
rows=1 width=16) (actual time=155.38..157.30 rows=857 loops=1)
                      ->  Unique  (cost=5300.77..5300.80 rows=1
width=16) (actual time=155.37..156.50 rows=857 loops=1)
                            ->  Sort  (cost=5300.77..5300.79 rows=5
width=16) (actual time=155.37..155.75 rows=1580 loops=1)
                                  Sort Key: s1.objectid
                                  ->  Hash Join  (cost=2138.54..5300.73
rows=5 width=16) (actual time=2.39..153.72 rows=1580 loops=1)
                                        Hash Cond: ("outer".objectid =
"inner".objectid)
                                        Join Filter: ("outer".id >
"inner".id)
                                        ->  Seq Scan on status s2
(cost=0.00..3158.31 rows=735 width=8) (actual time=0.01..114.89
rows=50744 loops=1)
                                              Filter: (("type" = 54) AND
(status <> 61))
                                        ->  Hash  (cost=2138.53..2138.53
rows=4 width=8) (actual time=2.29..2.29 rows=0 loops=1)
                                              ->  Index Scan using
status_statustypestamp_idx on status s1  (cost=0.00..2138.53 rows=4
width=8) (actual time=0.03..1.77 rows=861 loops=1)
                                                    Index Cond: (status
= 61)
                                                    Filter: ("type" = 54)


------------------------------------------------------------------------
------------------------------------------------------------------------
-----------------------------------
  SetOp Except  (cost=2016.01..2016.03 rows=1 width=16) (actual
time=69635.62..69637.74 rows=960 loops=1)
    ->  Sort  (cost=2016.01..2016.02 rows=2 width=16) (actual
time=69635.60..69636.18 rows=960 loops=1)
          Sort Key: objectid
          ->  Append  (cost=0.00..2016.00 rows=2 width=16) (actual
time=0.27..69633.61 rows=960 loops=1)
                ->  Subquery Scan "*SELECT* 1"  (cost=0.00..827.83
rows=1 width=4) (actual time=0.26..27.73 rows=960 loops=1)
                      ->  Index Scan using status_statustypestamp_idx on
status  (cost=0.00..827.83 rows=1 width=4) (actual time=0.26..25.69
rows=960 loops=1)
                            Index Cond: (status = 61)
                            Filter: ("type" = 54)
                ->  Subquery Scan "*SELECT* 2"  (cost=1188.16..1188.17
rows=1 width=16) (actual time=69604.73..69604.73 rows=0 loops=1)
                      ->  Unique  (cost=1188.16..1188.17 rows=1
width=16) (actual time=69604.73..69604.73 rows=0 loops=1)
                            ->  Sort  (cost=1188.16..1188.17 rows=1
width=16) (actual time=69604.72..69604.72 rows=0 loops=1)
                                  Sort Key: s1.objectid
                                  ->  Nested Loop  (cost=0.00..1188.15
rows=1 width=16) (actual time=69604.62..69604.62 rows=0 loops=1)
                                        ->  Index Scan using
status_statustypestamp_idx on status s1  (cost=0.00..827.83 rows=1
width=8) (actual time=0.06..59.51 rows=960 loops=1)
                                              Index Cond: (status = 61)
                                              Filter: ("type" = 54)
                                        ->  Index Scan using status_idx
on status s2  (cost=0.00..304.33 rows=1 width=8) (actual
time=72.42..72.42 rows=0 loops=960)
                                              Index Cond: ((s2.id >
"outer".id) AND ("outer".objectid = s2.objectid))
                                              Filter: (("type" = 54) AND
((status !) = 61))
  Total runtime: 69639.04 msec

-kaolin fire


pgsql-admin by date:

Previous
From: Tomasz Myrta
Date:
Subject: Re: Install psql only?
Next
From: "Uwe C. Schroeder"
Date:
Subject: Slony setup help needed