Me enfrento a un problema en el que la siguiente consulta tarda mucho tiempo en ejecutarse en Postgres 9.2:

select coalesce(sum(col_a), 0) 
from table_a 
where tid not in ( 
    select distinct tid 
    from table_b 
    where col_b = 13 )

Tenga en cuenta que tid es la clave principal en table_a. Para table_b, tid está indexado y hace referencia a table_a como una clave externa.

El problema ocurre principalmente cuando el disco está casi lleno y se está reiniciando en la tabla. No soy un experto en bases de datos, y realmente no entiendo cuál podría ser el problema.

¿Puede alguien ayudarme a entender el problema / decirme si hay una consulta más óptima?

1
tinkerbeast 28 abr. 2020 a las 11:08

2 respuestas

Lo intentaría con NOT EXISTS:

select coalesce(sum(a.col_a), 0) 
from table_a a
where not exists (select 1 from table_b b where b.tid = a.tid and b.col_b = 13);

Además, la agregación también sería útil:

select coalesce(sum(a.col_a), 0) 
from table_a a inner join
     table_b b
     on b.tid = a.tid
group by a.tid
having count(*) filter (where b.col_b = 13) = 0;

Una opción más es usar left join:

select coalesce(sum(a.col_a), 0) 
from table_a a left join
     table_b b
     on b.tid = a.tid and b.col_b = 13
where b.tid is null;

Para un rendimiento óptimo, el índice sería útil table_a(tid, col_a), table_b(tid, col_b)

0
Yogesh Sharma 28 abr. 2020 a las 08:50

Recomendaría NOT EXISTS con el índice correcto . Entonces, escriba la consulta como:

select coalesce(sum(col_a), 0) 
from table_a a
where not exists (select 1
                  from table_b b
                  where b.tid = a.tid and b.col_b = 13
                 );

El índice que desea está en table_b(tid, col_b):

create index idx_table_b_tid_col_b on table_b(id, col_b);
0
Gordon Linoff 28 abr. 2020 a las 11:36