Знать количество внешних ключей в каждой таблице — Postgres

#sql #postgresql #optimization

Вопрос:

Я надеюсь, что вы все в добром здравии. Я хочу отобразить количество раз, когда внешний ключ присутствует в его дочерней таблице. Например, у меня есть таблица компании с первичным ключом «cin», который ссылается на пять других таблиц, и я хочу знать, сколько раз каждый «cin» присутствует в других таблицах.

Я сделал запрос, который отлично работает с небольшим объемом данных, но когда я запускаю его в базе данных объемом 17 ГБ, это занимает целую вечность (и все еще выполняется прямо сейчас), где » ov «- это имя базы данных, а «opi», «zii», «li», » kvi » и » kra » — это остальные пять таблиц, с которыми cin связан как внешний ключ.

 Select c.cin, name, br_section, address_line,
(Select count(cin) from ov.opi
where cin = c.cin)  as opi_count,
(Select count(cin) from ov.zii
where cin = c.cin) as zii_count,
(Select count(cin) from li
where cin = c.cin) as li_count,
(Select count(cin) from ov.kvi
where cin = c.cin) as kvi_count,
(Select count(cin) from ov.krators
where cin = c.cin) as kra_count
from ov.company as c 
group by c.cin
 

Как я могу оптимизировать его для достижения быстрых результатов? Ожидаемый результат примерно такой

 cin   opi_count   zii_count   li_count   kvi_count   kri_count
1        56         NULL         2         NULL         9
2       NULL        140         NULL        10          23
3        2          90           10        NULL         2
4        34         NULL         89         3          NULL
5       NULL        34           2          9          NULL
.        .           .           .          .           .
.        .           .           .          .           .
.        .           .           .          .           .
 

Спасибо вам за ваш tme, Ура!

Ответ №1:

Ваш код оптимизирован. Единственным улучшением был бы индекс cin в каждой из таблиц ссылок. Итак, указатель на ov.opi(cin) , ov.zii(cin) , и так далее.

Комментарии:

1. После создания индексов теперь этот запрос бесконечного времени выполняется за 3 секунды. Ваше здоровье!