Search Postgresql Archives

Re: Queries joining views

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Tom Lane wrote:
Alban Hertroys <alban@xxxxxxxxxxxxxxxxx> writes:
tablename         | mm_product_table
attname           | number
histogram_bounds  | {2930,3244,3558,3872,4186,4500,4814,5128,5442,5756,6070}

tablename         | mm_insrel_table
attname           | snumber
histogram_bounds | {135,3768,4780,14822,57048,92958,125442,158954,433002,502836,610034}

Hmm ... if I'm not still confused, these are the two columns being
mergejoined in your slow query (would you double-check that?).

That's correct.

I read up some on the meaning of the pg_stats values, and I noticed that mm_insrel_tables' snumber and dnumber columns seem to have a rather bad correlation. I think this could be improved by clustering on an index over (number, snumber, dnumber); is that correct?

But the numbers don't seem to add up.  Given those stats the estimate
should be that something over 20% of the mm_insrel_table has to be
scanned to complete the join (since 6070 falls into the third decile
of the other histogram).  But we saw from Alban's original post that
the planner must be estimating well under 10% of the table needs to
be scanned.  Either we're still confused about which columns are being
joined, or there's some weird bug in the computation.

Since the start of this thread the insrel table has grown to 339195 records (it was closer to 330,000), maybe that changed the statistics a bit. To be sure, attached is the query plan of the problematic query again at this moment.

The other table involved, mm_medical_care_container_table, has the following stats on number:

zorgweb_solaris=> select * from pg_stats where attname = 'number' and tablename = 'mm_medical_care_container_table'; -[ RECORD 1 ]-----+-------------------------------------------------------------------------------
schemaname        | public
tablename         | mm_medical_care_container_table
attname           | number
null_frac         | 0
avg_width         | 4
n_distinct        | -1
most_common_vals  |
most_common_freqs |
histogram_bounds | {418768,436686,455444,473600,490610,508680,527182,545038,562786,578528,595132}
correlation       | 0.339138

I sure hope we get this mystery unveiled...

Regards,
--
Alban Hertroys
alban@xxxxxxxxxxxxxxxxx

magproductions b.v.

T: ++31(0)534346874
F: ++31(0)534346876
M:
I: www.magproductions.nl
A: Postbus 416
   7500 AK Enschede

// Integrate Your World //
zorgweb_solaris=> explain analyze SELECT
zorgweb_solaris-> insrel.rnumber,insrel.dnumber,insrel.snumber,insrel.dir,insrel.number,medical_care_container.number,product.number
zorgweb_solaris-> FROM mm_medical_care_container medical_care_container,mm_insrel
zorgweb_solaris-> insrel,mm_product product WHERE medical_care_container.number=558332 AND
zorgweb_solaris-> (medical_care_container.number=insrel.dnumber AND
zorgweb_solaris(> product.number=insrel.snumber AND insrel.dir<>1);
                                                                                             QUERY PLAN                                                                   
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Nested Loop  (cost=0.00..178.61 rows=1 width=28) (actual time=56.089..137.304 rows=1 loops=1)
   ->  Nested Loop  (cost=0.00..174.67 rows=1 width=28) (actual time=56.041..137.250 rows=1 loops=1)
         ->  Merge Join  (cost=0.00..170.73 rows=1 width=28) (actual time=55.986..137.189 rows=1 loops=1)
               Merge Cond: ("outer".number = "inner".number)
               ->  Nested Loop  (cost=0.00..2966.75 rows=30 width=28) (actual time=46.161..125.315 rows=2 loops=1)
                     ->  Nested Loop  (cost=0.00..2848.50 rows=30 width=24) (actual time=46.108..125.205 rows=2 loops=1)
                           ->  Index Scan using mm_insrel_full_idx on mm_insrel_table  (cost=0.00..2678.20 rows=30 width=20) (actual time=46.042..125.067 rows=2 loops=1)
                                 Index Cond: (dnumber = 558332)
                           ->  Index Scan using mm_medical_care_container_table_pkey on mm_medical_care_container_table  (cost=0.00..5.67 rows=1 width=4) (actual time=0.048..0.049 rows=1 loops=2)
                                 Index Cond: (558332 = number)
                     ->  Index Scan using mm_object_pkey on mm_object  (cost=0.00..3.93 rows=1 width=4) (actual time=0.041..0.043 rows=1 loops=2)
                           Index Cond: (mm_object.number = "outer".snumber)
               ->  Index Scan using mm_product_table_pkey on mm_product_table  (cost=0.00..67.90 rows=1571 width=4) (actual time=0.024..9.462 rows=1571 loops=1)
         ->  Index Scan using mm_object_pkey on mm_object  (cost=0.00..3.93 rows=1 width=4) (actual time=0.043..0.045 rows=1 loops=1)
               Index Cond: ("outer".number = mm_object.number)
   ->  Index Scan using mm_object_pkey on mm_object  (cost=0.00..3.93 rows=1 width=4) (actual time=0.038..0.041 rows=1 loops=1)
         Index Cond: (number = 558332)
 Total runtime: 138.132 ms
(18 rows)


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]
  Powered by Linux