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/