Re: Optimizer problem in 8.1.6

Поиск
Список
Период
Сортировка
От Tom Lane
Тема Re: Optimizer problem in 8.1.6
Дата
Msg-id 24860.1182536074@sss.pgh.pa.us
обсуждение исходный текст
Ответ на Re: Optimizer problem in 8.1.6  (Fernando Schapachnik <fernando@mecon.gov.ar>)
Список pgsql-general
Fernando Schapachnik <fernando@mecon.gov.ar> writes:
> A rewritten query still exhibits the same behavior:

> EXPLAIN ANALYZE SELECT DISTINCT p.id
> FROM partes_tecnicos p
> WHERE
> p.id IN
>         (SELECT r.id_parte_tecnico FROM
>         rel_usr_sector_parte_tecnico r, active_users u
>         WHERE (r.id_usr=u.id AND u.login='xxx' AND
>         r.id_sector=p.id_sector_actual AND
>             p.id_cola_por_ambito=1)
> OR p.id_cola_por_ambito=1)
> AND p.id_situacion!=6;

[ shrug... ]  This is still telling the system to perform a
Cartesian-product join when p.id_cola_por_ambito=1.

A sane formulation of the query might look like

EXPLAIN ANALYZE SELECT DISTINCT p.id
FROM partes_tecnicos p
WHERE
(p.id_cola_por_ambito=1 OR
 p.id IN
        (SELECT r.id_parte_tecnico FROM
        rel_usr_sector_parte_tecnico r, active_users u
        WHERE (r.id_usr=u.id AND u.login='xxx' AND
        r.id_sector=p.id_sector_actual)))
AND p.id_situacion!=6;

ie, get the constant term out of the sub-select.  This is not exactly
the same thing though --- in particular, what do you intend should
happen if p.id has no matches whatsoever in r.id_parte_tecnico,
yet p.id_cola_por_ambito=1?

            regards, tom lane

В списке pgsql-general по дате отправления:

Предыдущее
От: Fernando Schapachnik
Дата:
Сообщение: Re: Optimizer problem in 8.1.6
Следующее
От: Bob Pawley
Дата:
Сообщение: Establishing a primary key