Hi
 
I have discovered an issue on my Postgresql database recently installed : it 
seems that the optimizer can not, when possible, simplify and rewrite a simple 
query before running it. Here is a simple and reproducible example :
 
my_db=# create table test (n numeric);
CREATE
my_db=# insert into test values (1); --> run 10 times
INSERT
my_db=# insert into test values (0); --> run 10 times
INSERT
my_db=# select count(*) from test;
count
-------
20
(1 row)
my_db=# vacuum full analyze test;
VACUUM
my_db=# explain select * from test where n = 1;
QUERY PLAN
------------------------------------------------------
Seq Scan on test (cost=0.00..1.25 rows=10 width=9)
Filter: (n = 1::numeric)
(2 rows)
 
my_db=# explain select * from test where n = 1 and n = 1;
QUERY PLAN
-----------------------------------------------------
Seq Scan on test (cost=0.00..1.30 rows=5 width=9)
Filter: ((n = 1::numeric) AND (n = 1::numeric))
(2 rows)
 
In the first SELECT query (with "where n=1"), the estimated number of returned 
rows is correct (10), whereas in the second SELECT query (with "where n=1 and 
n=1"), the estimated number of returned rows is 5 (instead of 10 !)
So the optimizer has under-estimated the number of rows returned
That issue is very annoying because with generated SQL queries (from Business 
Objects for example) on big tables, it is possible that some queries have 
several times the same "where" condition ("where n=1 and n=1" for example), and 
as the optimizer is under-estimating the number of returned rows, some bad 
execution plans can be chosen (nested loops instead of hash joins for example)
 
Is the estimated number of returned rows directly linked to the decision of the 
optimizer to chose Hash Joins or Nested Loops in join queries ?
Is there a way for the Postgresql optimizer to be able to simplify and rewrite 
the SQL statements before running them ? Are there some parameters that could 
change the execution plans ?
 
Thanks by advance for your help
 
Jean-Francois SURANTYN
 

**********************************************************************
This email and any files transmitted with it are confidential and
intended solely for the use of the individual or entity to whom they
are addressed. If you have received this email in error please notify
the system manager.

Supermarchés MATCH, Société Par Actions Simplifiée au capital de 10 420 100 €, 
immatriculée au RCS de LILLE sous le Numéro B 785 480 351
Siège : 250, rue du Général de Gaulle - BP 201 - 59 561 LA MADELEINE Cedex
**********************************************************************

Reply via email to