Ruben Fitó escribió:

> Tengo la siguiente query en postgresql que tiene un coste de casi un minuto:
> 
> EXPLAIN
> SELECT
>   mtx.oper_tipus,
>   mtx.oper_estat
> FROM
>   m_transaccions mtx
>   INNER JOIN comm_pax_transactions pax ON (mtx.num_operacio = pax.num_oper)
> WHERE
>   mtx.estacio = 333
>   AND mtx.oper_tipus IN ('F', 'f', 'P', 'p')
>   AND mtx.oper_estat IN (0, 1)
>   AND mtx.num_operacio >
> *COALESCE(    (      SELECT         num_oper_end       FROM
> m_closures       WHERE         station = 333       ORDER BY         id DESC
>       LIMIT         1    ), 0  )*;

¿Probaste extrayendo el num_oper_end en una CTE?

WITH oper_end AS (select num_oper_end from m_closures ...)
select ...
from m_transaccions
    inner join comm_pax_transactions ...
where mtx.num_operacio > coalesce( select bla from oper_end, 0);

Mira el explain y en caso de que Postgres decida volver el CTE como
parte de la consulta principal, prueba poniéndole MATERIALIZED al WITH
oper_end.

-- 
Álvaro Herrera         PostgreSQL Developer  —  https://www.EnterpriseDB.com/


Reply via email to