Re: Huge overestimation in rows expected results in bad plan
От | bricklen |
---|---|
Тема | Re: Huge overestimation in rows expected results in bad plan |
Дата | |
Msg-id | AANLkTimDn9UmbTMHOKHWaCP6Kxcfij60pdZbNCvYKmo5@mail.gmail.com обсуждение исходный текст |
Ответ на | Re: Huge overestimation in rows expected results in bad plan (Tom Lane <tgl@sss.pgh.pa.us>) |
Список | pgsql-performance |
On Tue, Nov 9, 2010 at 3:55 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote: > bricklen <bricklen@gmail.com> writes: >> On Tue, Nov 9, 2010 at 3:29 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote: >>> The query doesn't seem to match the plan. Where is that OR (c.id = >>> 38441828354::bigint) condition coming from? > >> Ah sorry, I was testing it with and without that part. Here is the >> corrected query, with that as part of the join condition: > >> explain analyze >> select c.id, c.transactionid, c.clickgenerated, c.confirmed, >> c.rejected, cr.rejectedreason >> from conversion c >> inner join conversionrejected cr on cr.idconversion = c.id or c.id = 38441828354 >> where date = '2010-11-06' >> and idaction = 12906 >> and idaffiliate = 198338 >> order by transactionid; > > Hm. Well, the trouble with that query is that if there is any > conversion row with c.id = 38441828354, it will join to *every* row of > conversionrejected. The planner not unreasonably assumes there will be > at least one such row, so it comes up with a join size estimate that's >>= size of conversionrejected; and it also tends to favor a seqscan > since it thinks it's going to have to visit every row of > conversionrejected anyway. > > If you have reason to think the c.id = 38441828354 test is usually dead > code, you might see if you can get rid of it, or at least rearrange the > query as a UNION of two independent joins. > > regards, tom lane > Okay, thanks. I'll talk to the developer that wrote that query and see what he has to say about it. Cheers, Bricklen
В списке pgsql-performance по дате отправления: