Recent 7.4 change slowed down a query by a factor of 3 - Mailing list pgsql-performance

From Bruno Wolff III
Subject Recent 7.4 change slowed down a query by a factor of 3
Date
Msg-id 20030618150210.GA20603@wolff.to
Whole thread Raw
Responses Re: Recent 7.4 change slowed down a query by a factor of 3  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-performance
The query below was running in a bit under 300ms on a version of 7.4
from less than a week ago until I updated to the version from last night.
Now it takes about 800ms using a significantly different plan.
The query is:
explain analyze
  select count(1)
    from
      (select distinct on (areaid) touched
        from crate
        order by areaid desc, touched desc)
        as current
    where touched >= localtimestamp + '10 year ago'
    group by touched >= localtimestamp + '2 year ago'
    order by touched >= localtimestamp + '2 year ago' desc;

I don't have the earlier version of 7.4 around, but I get the better plan
in 7.3.3.
                                version
------------------------------------------------------------------------
 PostgreSQL 7.4devel on i686-pc-linux-gnu, compiled by GCC egcs-2.91.66
(1 row)

                                                              QUERY PLAN
               

---------------------------------------------------------------------------------------------------------------------------------------
 Sort  (cost=1756.33..1756.50 rows=67 width=19) (actual time=795.64..795.65 rows=2 loops=1)
   Sort Key: (touched >= (('now'::text)::timestamp(6) without time zone + '-2 years'::interval))
   ->  HashAggregate  (cost=1753.46..1754.30 rows=67 width=19) (actual time=795.48..795.48 rows=2 loops=1)
         ->  Subquery Scan current  (cost=1624.62..1737.38 rows=3216 width=19) (actual time=631.84..784.75 rows=5339
loops=1)
               Filter: (touched >= (('now'::text)::timestamp(6) without time zone + '-10 years'::interval))
               ->  Unique  (cost=1624.62..1705.22 rows=3216 width=19) (actual time=631.72..713.66 rows=5364 loops=1)
                     ->  Sort  (cost=1624.62..1664.92 rows=16119 width=19) (actual time=631.72..639.77 rows=16119
loops=1)
                           Sort Key: areaid, touched
                           ->  Seq Scan on crate  (cost=0.00..498.19 rows=16119 width=19) (actual time=0.02..48.85
rows=16119loops=1) 
 Total runtime: 800.88 msec
(10 rows)

                      Table "public.crate"
 Column  |            Type             |       Modifiers
---------+-----------------------------+------------------------
 areaid  | text                        | not null
 gameid  | text                        | not null
 rate    | integer                     | not null default 5000
 frq     | integer                     | not null default 0
 opp     | integer                     | not null default 0
 rmp     | integer                     | not null default 0
 trn     | integer                     | not null default 0
 rp      | text                        |
 gm      | text                        |
 touched | timestamp without time zone | not null default 'now'
Indexes:
    "crate_pkey" PRIMARY KEY btree (areaid, gameid),
    "crate_game" btree (gameid, areaid),
    "crate_touched" btree (areaid, touched)
Check Constraints:
    "rate_nonnegative" CHECK (rate >= 0),
    "rate_other_interested" CHECK ((frq > 0) OR (rate = 5000)),
    "frq_nonnegative" CHECK (frq >= 0),
    "opp_nonnegative" CHECK (opp >= 0),
    "rmp_nonnegative" CHECK (rmp >= 0),
    "trn_nonnegative" CHECK (trn >= 0)
Foreign Key Constraints:
    "bad_areaid" FOREIGN KEY (areaid) REFERENCES cname(areaid),
    "bad_gameid" FOREIGN KEY (gameid) REFERENCES games(gameid)

                               version
---------------------------------------------------------------------
 PostgreSQL 7.3.3 on i686-pc-linux-gnu, compiled by GCC egcs-2.91.66
(1 row)

                                                                                 QUERY PLAN
                                                    

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Sort  (cost=1094.46..1094.87 rows=161 width=19) (actual time=274.17..274.18 rows=2 loops=1)
   Sort Key: (touched >= (('now'::text)::timestamp(6) without time zone + '-2 years'::interval))
   ->  Aggregate  (cost=1076.46..1088.55 rows=161 width=19) (actual time=263.78..274.09 rows=2 loops=1)
         ->  Group  (cost=1076.46..1084.52 rows=1612 width=19) (actual time=255.12..269.69 rows=5339 loops=1)
               ->  Sort  (cost=1076.46..1080.49 rows=1612 width=19) (actual time=255.11..258.09 rows=5339 loops=1)
                     Sort Key: (touched >= (('now'::text)::timestamp(6) without time zone + '-2 years'::interval))
                     ->  Subquery Scan current  (cost=0.00..990.59 rows=1612 width=19) (actual time=0.12..240.81
rows=5339loops=1) 
                           Filter: (touched >= (('now'::text)::timestamp(6) without time zone + '-10 years'::interval))
                           ->  Unique  (cost=0.00..990.59 rows=1612 width=19) (actual time=0.04..159.11 rows=5364
loops=1)
                                 ->  Index Scan Backward using crate_touched on crate  (cost=0.00..950.30 rows=16119
width=19)(actual time=0.04..82.15 rows=16119 loops=1) 
 Total runtime: 275.32 msec
(11 rows)

                      Table "public.crate"
 Column  |            Type             |       Modifiers
---------+-----------------------------+------------------------
 areaid  | text                        | not null
 gameid  | text                        | not null
 rate    | integer                     | not null default 5000
 frq     | integer                     | not null default 0
 opp     | integer                     | not null default 0
 rmp     | integer                     | not null default 0
 trn     | integer                     | not null default 0
 rp      | text                        |
 gm      | text                        |
 touched | timestamp without time zone | not null default 'now'
Indexes: crate_pkey primary key btree (areaid, gameid),
         crate_game btree (gameid, areaid),
         crate_touched btree (areaid, touched)
Check constraints: "trn_nonnegative" (trn >= 0)
                   "rmp_nonnegative" (rmp >= 0)
                   "opp_nonnegative" (opp >= 0)
                   "frq_nonnegative" (frq >= 0)
                   "rate_other_interested" ((frq > 0) OR (rate = 5000))
                   "rate_nonnegative" (rate >= 0)
Foreign Key constraints: bad_gameid FOREIGN KEY (gameid) REFERENCES games(gameid) ON UPDATE NO ACTION ON DELETE NO
ACTION,
                         bad_areaid FOREIGN KEY (areaid) REFERENCES cname(areaid) ON UPDATE NO ACTION ON DELETE NO
ACTION


pgsql-performance by date:

Previous
From: "SZŰCS Gábor"
Date:
Subject: Re: Postgres Connections Requiring Large Amounts of Memory
Next
From: Tom Lane
Date:
Subject: Re: Recent 7.4 change slowed down a query by a factor of 3