BUG #3519: Postgres takes the wrong query plan resulting in performance issues

From: "Mouhamadou DIA" <mdia(at)accovia(dot)com>
To: pgsql-bugs(at)postgresql(dot)org
Subject: BUG #3519: Postgres takes the wrong query plan resulting in performance issues
Date: 2007-08-06 14:47:57
Message-ID: 200708061447.l76ElvUm001042@wwwmaster.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs


The following bug has been logged online:

Bug reference: 3519
Logged by: Mouhamadou DIA
Email address: mdia(at)accovia(dot)com
PostgreSQL version: 8.2.4
Operating system: Solaris 10 and Linux Redhat 4
Description: Postgres takes the wrong query plan resulting in
performance issues
Details:

Hello,

I have a Postgres instance (version 8.1.19) running on a Solaris 10 machine.
When I run the following query

SELECT * FROM PROR_ORG, ( ( ( ( (PRPT_PRT LEFT OUTER JOIN PRPT_PRTADR ON
PRPT_PRT.PRT_NRI = PRPT_PRTADR.PRT_NRI AND PRPT_PRTADR.ADR_F_DEF=true)

LEFT OUTER JOIN PLGE_CTY ON PRPT_PRTADR.CTY_NRI = PLGE_CTY.CTY_NRI) LEFT

OUTER JOIN PLGE_CTY1 PLGE_CTY_PLGE_CTY1 ON PLGE_CTY.CTY_NRI =

PLGE_CTY_PLGE_CTY1.CTY_NRI AND PLGE_CTY_PLGE_CTY1.LNG_CD = 'fr') LEFT

OUTER JOIN PLGE_CTRSD ON PRPT_PRTADR.CTRSD_CD = PLGE_CTRSD.CTRSD_CD

AND PRPT_PRTADR.CTR_ISO_CD = PLGE_CTRSD.CTR_ISO_CD) LEFT OUTER JOIN

PLGE_CTR ON PRPT_PRTADR.CTR_ISO_CD = PLGE_CTR.CTR_ISO_CD) , PROR_ORG1

PROR_ORG_PROR_ORG1, PROR_ORGT, PROR_ORGT1 PROR_ORGT_PROR_ORGT1

WHERE ( (PROR_ORG.ORGT_CD = PROR_ORGT.ORGT_CD) AND

(PROR_ORGT.ORGT_CD = PROR_ORGT_PROR_ORGT1.ORGT_CD AND

PROR_ORGT_PROR_ORGT1.LNG_CD = 'fr') AND (PROR_ORG.PRT_NRI =

PROR_ORG_PROR_ORG1.PRT_NRI AND PROR_ORG_PROR_ORG1.LNG_CD = 'fr') AND

(PROR_ORG.PRT_NRI = PRPT_PRT.PRT_NRI) ) AND ( ((PROR_ORG.ORGT_CD ='CHAIN'))
)

it takes 45 seconds to run. In this case the optimizer does a sequential
scan of the PRPT_PRT table (which is the largest one) despite the existence
of an index on PRT_NRI column of PRPT_PRT table.

Ive activated the GEQO but it still takes nearly the same time to run
(between 40 and 45s).

When I change the order of PRPT_PRT and PROR_ORG tables, it takes only 30
milliseconds to run. In this case the optimizer uses the index on PRT_NRI
column of PRPT_PRT table, what is normal and what I was expecting.

Is there a known problem with the Postgres optimizer?

For your information, the same query takes 20 milliseconds to run on
Informix and 60 milliseconds to run on Oracle independently of the order of
the tables in the query.

PRPT_PRT has 1.3 millions rows

PRPT_PRTADR has 300.000 rows

PROR_ORG has 1500 rows

These are the largest tables, all the others are small tables. All
statistics are up to date.

I read from the release notes that starting from Postgres 8.2 the optimizer
supports reordering outer joins.
I've migrated to Postgres 8.2.4 and run the same query. It takes now 20
seconds which is still not acceptable.

PS: I did the same test using Redhat Linux 4 and I have similar times
Please help

Thanks

Responses

Browse pgsql-bugs by date

  From Date Subject
Next Message Tom Lane 2007-08-06 15:04:37 Re: BUG #3516: Incomplete #ifdef statement in s_lock.h
Previous Message Tomasz Kawczynski 2007-08-06 13:39:46 BUG #3518: ERROR: IN types character varying and integer cannot be matched