Re: osdl-dbt3 run results - puzzled by the execution - Mailing list pgsql-performance

From Jenny Zhang
Subject Re: osdl-dbt3 run results - puzzled by the execution
Date
Msg-id 1063996535.32392.9.camel@ibm-a.pdx.osdl.net
Whole thread Raw
In response to Re: osdl-dbt3 run results - puzzled by the execution plans  (Manfred Koizar <mkoi-pg@aon.at>)
Responses Re: osdl-dbt3 run results - puzzled by the execution  (Manfred Koizar <mkoi-pg@aon.at>)
List pgsql-performance
I posted more results as you requested:

On Fri, 2003-09-19 at 08:08, Manfred Koizar wrote:
> On Thu, 18 Sep 2003 15:36:50 -0700, Jenny Zhang <jenny@osdl.org>
> wrote:
> >We thought the large effective_cache_size should lead us to better
> >plans. But we found the opposite.
>
> The common structure of your query plans is:
>
>  Sort
>    Sort Key: sum((partsupp.ps_supplycost * partsupp.ps_availqty))
>    InitPlan
>      ->  Aggregate
>            ->  SubPlan
>    ->  Aggregate
>          Filter: (sum((ps_supplycost * ps_availqty)) > $0)
>          ->  Group
>                ->  Sort
>                      Sort Key: partsupp.ps_partkey
>                      ->  SubPlan (same as above)
>
> where the SubPlan is
>
>  ->  Merge Join  (cost=519.60..99880.05 rows=32068 width=65)
>                  (actual time=114.78..17435.28 rows=30400 loops=1)
>                  ctr=5.73
>        Merge Cond: ("outer".ps_suppkey = "inner".s_suppkey)
>        ->  Index Scan using i_ps_suppkey on partsupp
>                  (cost=0.00..96953.31 rows=801712 width=34)
>                  (actual time=0.42..14008.92 rows=799361 loops=1)
>                  ctr=6.92
>        ->  Sort  (cost=519.60..520.60 rows=400 width=31)
>                  (actual time=106.88..143.49 rows=30321 loops=1)
>                  ctr=3.63
>              Sort Key: supplier.s_suppkey
>              ->  SubSubPlan
>
> for large effective_cache_size and
>
>  ->  Nested Loop  (cost=0.00..130168.30 rows=32068 width=65)
>                   (actual time=0.56..1374.41 rows=30400 loops=1)
>                   ctr=94.71
>        ->  SubSubPlan
>        ->  Index Scan using i_ps_suppkey on partsupp
>                  (cost=0.00..323.16 rows=80 width=34)
>                  (actual time=0.16..2.98 rows=80 loops=380)
>                  ctr=108.44
>              Index Cond: (partsupp.ps_suppkey = "outer".s_suppkey)
>
> for small effective_cache_size.  Both subplans have an almost
> identical subsubplan:
>
> ->  Nested Loop  (cost=0.00..502.31 rows=400 width=31)
>                  (actual time=0.23..110.51 rows=380 loops=1)
>                  ctr=4.55
>       Join Filter: ("inner".s_nationkey = "outer".n_nationkey)
>       ->  Seq Scan on nation  (cost=0.00..1.31 rows=1 width=10)
>                               (actual time=0.08..0.14 rows=1 loops=1)
>                               ctr=9.36
>             Filter: (n_name = 'ETHIOPIA'::bpchar)
>       ->  Seq Scan on supplier (cost=0.00..376.00 rows=10000 width=21)
>                           (actual time=0.10..70.72 rows=10000 loops=1)
>                                ctr=5.32
>
> I have added the ctr (cost:time ratio) for each plan node.  These
> values are mostly between 5 and 10 with two notable exceptions:
>
> 1)     ->  Sort  (cost=519.60..520.60 rows=400 width=31)
>                  (actual time=106.88..143.49 rows=30321 loops=1)
>                  ctr=3.63
>
> It has already been noticed by Matt Clark that this is the only plan
> node where the row count estimation looks wrong.  However, I don't
> believe that this has great influence on the total cost of the plan,
> because the ctr is not far from the usual range and if it were a bit
> higher, it would only add a few hundred cost units to a branch costing
> almost 100000 units.  BTW I vaguely remember that there is something
> strange with the way actual rows are counted inside a merge join.
> Look at the branch below this plan node:  It shows an actual row count
> of 380.
>
> 2)     ->  Index Scan using i_ps_suppkey on partsupp
>                  (cost=0.00..323.16 rows=80 width=34)
>                  (actual time=0.16..2.98 rows=80 loops=380)
>                  ctr=108.44
>
> Here we have the only plan node where loops > 1, and it is the only
> one where the ctr is far off.  The planner computes the cost for one
> loop and multiplies it by the number of loops (which it estimates
> quite accurately to be 400), thus getting a total cost of ca. 130000.
> We have no reason to believe that the single loop cost is very far
> from reality (for a *single* index scan), but the planner does not
> account for additional index scans hitting pages in the cache that
> have been brought in by preceding scans.  This is a known problem, Tom
> has mentioned it several times, IIRC.
>
> Now I'm very interested in getting a better understanding of this
> problem, so could you please report the results of
>
> . \d i_ps_suppkey
>
http://developer.osdl.org/~jenny/pgsql-optimizer/disc_i_ps_suppkey
> . VACUUM VERBOSE ANALYSE partsupp;
>   VACUUM VERBOSE ANALYSE supplier;
>
http://developer.osdl.org/~jenny/pgsql-optimizer/vacuum_verbose_analyze_partsupp
http://developer.osdl.org/~jenny/pgsql-optimizer/vacuum_verbose_analyze_suppler
> . SELECT attname, null_frac, avg_witdh, n_distinct, correlation
>     FROM pg_stats
>    WHERE tablename = 'partsupp' AND attname IN ('ps_suppkey', ...);
>
>   Please insert other interesting column names for ..., especially
>   those contained in i_ps_suppkey, if any.
>
I put all the related columns
http://developer.osdl.org/~jenny/pgsql-optimizer/info_partsupp_col

> . SELECT relname, relpages, reltuples
>     FROM pg_class
>    WHERE relname IN ('partsupp', 'supplier', ...);
>                                              ^^^
>                     Add relevant index names here.
>
I put all the related tables
http://developer.osdl.org/~jenny/pgsql-optimizer/info_table

> . EXPLAIN ANALYSE
>   SELECT ps_partkey, ps_supplycost, ps_availqty
>     FROM partsupp, supplier
>    WHERE ps_suppkey = s_suppkey AND s_nationkey = '<youknowit>';
>
>   The idea is to eliminate parts of the plan that are always the same.
>   Omitting nation is possibly to much a simplification.  In this case
>   please re-add it.
>   Do this test for small and large effective_cache_size.
>   Force the use of other join methods by setting enable_<joinmethod>
>   to off.  Post all results.
>
http://developer.osdl.org/~jenny/pgsql-optimizer/explain_query_mk
>
> Jenny, I understand that this long message contains more questions
> than answers and is not of much help for you.  OTOH your tests might
> be very helpful for Postgres development ...
Let me know if you need anything else

Jenny


pgsql-performance by date:

Previous
From: Manfred Koizar
Date:
Subject: Re: osdl-dbt3 run results - puzzled by the execution plans
Next
From: Jenny Zhang
Date:
Subject: Re: osdl-dbt3 run results - puzzled by the execution