Re: EXISTS optimization

Поиск
Список
Период
Сортировка
Искать
От
Tom Lane
Тема
Re: EXISTS optimization
Дата
Msg-id
25339.1174686582@sss.pgh.pa.us
Ответ на
EXISTS optimization (Kevin Grittner)
Список
Дерево обсуждения
EXISTS optimization "Kevin Grittner" <Kevin.Grittner@wicourts.gov>
Re: EXISTS optimization Tom Lane <tgl@sss.pgh.pa.us>
Re: EXISTS optimization Martijn van Oosterhout <kleptog@svana.org>
Re: EXISTS optimization "Kevin Grittner" <Kevin.Grittner@wicourts.gov>
Re: EXISTS optimization Martijn van Oosterhout <kleptog@svana.org>
Re: EXISTS optimization "Kevin Grittner" <Kevin.Grittner@wicourts.gov>
Re: EXISTS optimization Tom Lane <tgl@sss.pgh.pa.us>
Re: [PERFORM] EXISTS optimization "Kevin Grittner" <Kevin.Grittner@wicourts.gov>
Re: [PERFORM] EXISTS optimization "Peter Kovacs" <peter.kovacs.1.0rc@gmail.com>
Re: [PERFORM] EXISTS optimization "Kevin Grittner" <Kevin.Grittner@wicourts.gov>
"Kevin Grittner"  writes:
> explain analyze
> SELECT "A"."adjustmentNo", "A"."tranNo", "A"."countyNo", "H"."date", "H"."userId", "H"."time"
>   FROM "Adjustment" "A"
>   JOIN "TranHeader" "H" ON ("H"."tranId" = "A"."adjustmentNo" AND "H"."countyNo" = "A"."countyNo" AND "H"."tranNo" = "A"."tranNo")
>   WHERE "H"."tranType" = 'A'
>     AND "A"."date" > DATE '2006-01-01'
>     AND "H"."countyNo" = 66
>     AND "A"."countyNo" = 66
>     AND EXISTS
>         (
>           SELECT 1 FROM "TranDetail" "D"
>             WHERE "D"."tranNo" = "H"."tranNo"
>               AND "D"."countyNo" = "H"."countyNo"
>               AND "D"."caseNo" LIKE '2006TR%'
>         )
> ;

> The commercial product scans the index on caseNo in TranDetail to build a work table of unique values, then uses indexed access to the TranHeader and then to Adjustment.

If you want that, try rewriting the EXISTS to an IN:

   AND ("H"."tranNo", "H"."countyNo") IN
        (
          SELECT "D"."tranNo", "D"."countyNo" FROM "TranDetail" "D"
            WHERE "D"."caseNo" LIKE '2006TR%'
        )

We don't currently try to flatten EXISTS into a unique/join plan as we
do for IN.  I seem to recall not doing so when I rewrote IN planning
because I didn't think it would be exactly semantically equivalent,
but that was awhile ago.  Right at the moment it seems like it ought
to be equivalent as long as the comparison operators are strict.

			regards, tom lane
В списке pgsql-hackers по дате отправления
От: Tom Lane
Дата:
От: Alvaro Herrera
Дата:
FAQ