Thread: query optimizer dont treat correctly OR

query optimizer dont treat correctly OR

From
"Luiz Rafael Culik Guimaraes"
Date:
Hello folks

See the command bellow. I use some thing simmilar about an decade on
Oracle,
Sybase, MSSQL, DB2, etc. But with  Postgresql , he generate an FULL TABLE
SCAN,
and consequenyly it take about 10 minutes to run (Very big table..)

----------------------------------------------------------------------

SELECT A.SR_RECNO , A.CDEMP, A.NRPED,A.SR_RECNO
FROM FTB01 A
WHERE  ( A.CONTROLE <= ' ' AND A.CDEMP = '75' AND A.NRPED < '0000261' )
OR ( A.CONTROLE = ' '  AND A.CDEMP < '75' )
OR ( A.CONTROLE < ' ' )
ORDER BY A.CDEMP DESC, A.NRPED DESC, A.SR_RECNO DESC
LIMIT 170

----------------------------------------------------------------------

Otherwise, is i write the query on the form of an little more  "dummy" and
eliminating the
 "OR"  and changing by  UNION, the time of execution drops to less  menos
of  two seconds

----------------------------------------------------------------------

SELECT TMP1.* FROM (
SELECT A.SR_RECNO, A.CDEMP, A.NRPED,A.SR_RECNO
FROM FTB01 A   WHERE  ( A.CONTROLE <= ' ' AND A.CDEMP = '75' AND A.NRPED <
'0000261' )
ORDER BY   A.CDEMP DESC, A.NRPED DESC, A.SR_RECNO DESC   LIMIT 170 ) TMP1
UNION
SELECT TMP2.* FROM (
SELECT A.SR_RECNO, A.CDEMP, A.NRPED,A.SR_RECNO
FROM FTB01 A   WHERE  ( A.CONTROLE = ' '  AND A.CDEMP < '75' )
ORDER BY   A.CDEMP DESC, A.NRPED DESC, A.SR_RECNO DESC   LIMIT 170 ) TMP2
UNION
SELECT TMP3.* FROM (
SELECT A.SR_RECNO, A.CDEMP, A.NRPED,A.SR_RECNO
FROM FTB01 A   WHERE  OR ( A.CONTROLE < ' ' )
ORDER BY   A.CDEMP DESC, A.NRPED DESC, A.SR_RECNO DESC   LIMIT 170 ) TMP3
ORDER BY CDEMP DESC, NRPED DESC, SR_RECNO DESC
LIMIT 170

----------------------------------------------------------------------

The  comand above works (even being 10 x slower then other Databases
) with our generate the  full scan.

Why Post do this wrong julgment  with the initial command?
Exist some thing that i can configure to to make postgres works correctly ?

Obs.:

* Tested on  versions 7.3.2 e 7.4.1
* Obvialy the vacuumm full analyse was executed

Thanks
Luiz



Re: [SQL] query optimizer dont treat correctly OR

From
Richard Huxton
Date:
On Tuesday 27 April 2004 15:48, Luiz Rafael Culik Guimaraes wrote:
> Hello folks
>
> See the command bellow. I use some thing simmilar about an decade on
> Oracle,
> Sybase, MSSQL, DB2, etc. But with  Postgresql , he generate an FULL TABLE
> SCAN,
> and consequenyly it take about 10 minutes to run (Very big table..)

> Why Post do this wrong julgment  with the initial command?
> Exist some thing that i can configure to to make postgres works correctly ?

You'll need to post the output of EXPLAIN ANALYSE for your query. This will
show how many rows PG thinks it will get back compared to how many it
actually gets back.

--
  Richard Huxton
  Archonet Ltd