Hello, No one to help me to understand this bad estimation rows ? It's *NOT* caused by :
- correlation between columns (cross-correlation) - bad statistics (i tried with default_statistics_target to 10 000) - bad number of distinct values - complexe join conditions I have no more ideas. thank you for your help. Mathieu VINCENT 2015-12-17 11:58 GMT+01:00 Mathieu VINCENT <mathieu.vinc...@pmsipilot.com>: > Adding foreign key between on t2 and t3, does not change the plan. > > drop table if exists t1; > drop table if exists t2; > drop table if exists t3; > > create table t1 as select generate_Series(1,200000) as c1; > create table t2 as select generate_Series(1,200000)%100+1 as c1; > create table t3 as select generate_Series(1,1500)%750+1 as c1; > > alter table t1 add PRIMARY KEY (c1); > create index on t2 (c1); > create index on t3 (c1); > ALTER TABLE t2 ADD CONSTRAINT t2_fk FOREIGN KEY (c1) REFERENCES t1(c1); > ALTER TABLE t3 ADD CONSTRAINT t3_fk FOREIGN KEY (c1) REFERENCES t1(c1); > > analyze verbose t1; > analyze verbose t2; > analyze verbose t3; > > EXPLAIN (analyze on, buffers on, verbose on) > select > * > from > t1 t1 > inner join t2 on t1.c1=t2.c1 > inner join t3 on t1.c1=t3.c1 > > Cordialement, > <http://www.psih.fr/>PSIH Décisionnel en santé > Mathieu VINCENT > Data Analyst > PMSIpilot - 61 rue Sully - 69006 Lyon - France > > 2015-12-17 11:37 GMT+01:00 Mathieu VINCENT <mathieu.vinc...@pmsipilot.com> > : > >> Here, another issue with row estimate. >> And, in this example, there is not correlation beetween columns in a same >> table. >> >> drop table if exists t1; >> drop table if exists t2; >> drop table if exists t3; >> >> create table t1 as select generate_Series(1,200000) as c1; >> create table t2 as select generate_Series(1,200000)%100 as c1; >> create table t3 as select generate_Series(1,1500)%750 as c1; >> >> alter table t1 add PRIMARY KEY (c1); >> create index on t2 (c1); >> create index on t3 (c1); >> >> analyze verbose t1; >> analyze verbose t2; >> analyze verbose t3; >> >> EXPLAIN (analyze on, buffers on, verbose on) >> select >> * >> from >> t1 t1 >> inner join t2 on t1.c1=t2.c1 >> inner join t3 on t2.c1=t3.c1 >> the explain plan : http://explain.depesz.com/s/YVw >> Do you understand how postgresql calculate the row estimate ? >> >> BR >> Mathieu VINCENT >> >> 2015-12-17 10:14 GMT+01:00 Matteo Grolla <matteo.gro...@gmail.com>: >> >>> Thank you both for the help! >>> happy holidays >>> >>> 2015-12-17 10:10 GMT+01:00 Mathieu VINCENT < >>> mathieu.vinc...@pmsipilot.com>: >>> >>>> thks Gunnar, >>>> >>>> I removed the correlation between t3.c1 and t3.c2 in this sql script : >>>> >>>> drop table if exists t1; >>>> drop table if exists t2; >>>> drop table if exists t3; >>>> drop table if exists t4; >>>> >>>> create table t1 as select generate_Series(1,300000) as c1; >>>> create table t2 as select generate_Series(1,400) as c1; >>>> create table t3 as select floor(random()*100+1) as c1, c2 from >>>> generate_Series(1,200000) c2; >>>> create table t4 as select generate_Series(1,200000) as c1; >>>> >>>> alter table t1 add PRIMARY KEY (c1); >>>> alter table t2 add PRIMARY KEY (c1); >>>> alter table t3 add PRIMARY KEY (c1,c2); >>>> create index on t3 (c1); >>>> create index on t3 (c2); >>>> alter table t4 add PRIMARY KEY (c1); >>>> >>>> analyze verbose t1; >>>> analyze verbose t2; >>>> analyze verbose t3; >>>> analyze verbose t4; >>>> >>>> EXPLAIN (analyze on, buffers on, verbose on) >>>> select >>>> * >>>> from >>>> t1 t1 >>>> inner join t2 on t1.c1=t2.c1 >>>> inner join t3 on t2.c1=t3.c1 >>>> inner join t4 on t3.c2=t4.c1 >>>> >>>> Now, the estimate is good : http://explain.depesz.com/s/gCX >>>> >>>> Have a good day >>>> >>>> Mathieu VINCENT >>>> >>>> 2015-12-15 11:21 GMT+01:00 Gunnar "Nick" Bluth < >>>> gunnar.bluth.ext...@elster.de>: >>>> >>>>> Am 15.12.2015 um 10:49 schrieb Andreas Kretschmer: >>>>> > Gunnar Nick Bluth <gunnar.bluth.ext...@elster.de> wrote: >>>>> > >>>>> >> Am 15.12.2015 um 09:05 schrieb Mathieu VINCENT: >>>>> >>> Hello, >>>>> >>> >>>>> >>> No one to help me to understand this bad estimation rows ? >>>>> >> >>>>> >> Well, >>>>> >> >>>>> >> on a rather beefy machine, I'm getting quite a different plan: >>>>> >> http://explain.depesz.com/s/3y5r >>>>> > >>>>> > you are using 9.5, right? Got the same plan with 9.5. >>>>> >>>>> Nope...: >>>>> version >>>>> >>>>> >>>>> ------------------------------------------------------------------------------------------------------------ >>>>> PostgreSQL 9.3.5 on x86_64-unknown-linux-gnu, compiled by gcc >>>>> (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3, 64-bit >>>>> >>>>> So much for those correlation improvements then ;-/ >>>>> >>>>> >>>>> > Btw.: Hi Gunnar ;-) >>>>> >>>>> Hi :) >>>>> >>>>> -- >>>>> Gunnar "Nick" Bluth >>>>> DBA ELSTER >>>>> >>>>> Tel: +49 911/991-4665 >>>>> Mobil: +49 172/8853339 >>>>> >>>>> >>>>> -- >>>>> Sent via pgsql-performance mailing list ( >>>>> pgsql-performance@postgresql.org) >>>>> To make changes to your subscription: >>>>> http://www.postgresql.org/mailpref/pgsql-performance >>>>> >>>> >>>> >>> >> >