#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 секунды. Ваше здоровье!