SQL get рассчитывает, используя подзапросы из нескольких связанных таблиц - PullRequest
1 голос
/ 18 апреля 2019

Предположим, у меня есть таблицы 1-4, все остальные таблицы связаны с таблицей1.Для чего стоит table1, table2 и table3 относительно малы, но table4 содержит много данных.

Теперь у меня есть следующий запрос:

SELECT t1.id
    , (SELECT COUNT(*) FROM table2 WHERE table1_id = t1.id) AS t2_count
    , (SELECT COUNT(*) FROM table3 WHERE table1_id = t1.id) AS t3_count
    , (SELECT COUNT(*) FROM table4 WHERE table1_id = t1.id) AS t4_count
FROM table1 t1

Из-за того, что подзапросыявляются зависимыми / коррелированными. Я предположил, что должен быть лучший способ (с точки зрения производительности) для получения данных.

Я пытался сделать следующее, но это резко увеличило время выполнения (примерно с 2 до 35 с).Я предполагаю, что множественные левые объединения создают очень большой набор данных?!

SELECT t1.id
    , COUNT(t2.id) AS t2_count
    , COUNT(t3.id) AS t3_count
    , COUNT(t4.id) AS t4_count
FROM table1 t1
    LEFT JOIN table2 t2 ON t2.table1_id = t1.id
    LEFT JOIN table3 t3 ON t3.table1_id = t1.id
    LEFT JOIN table4 t4 ON t4.table1_id = t1.id
GROUP BY t1.id

Есть ли лучший способ получить количество?Мне не нужны данные из других таблиц.

ОБНОВЛЕНИЕ:

Ответ Барта заставил меня подумать, что столбцы table1_idобнуляемый.Я добавил IS NOT NULL чек к пунктам WHERE, и это сократило время до 1 с.

SELECT t1.id
   , (SELECT COUNT(*) FROM table2 WHERE table1_id IS NOT NULL AND table1_id = t1.id) AS t2_count
   , (SELECT COUNT(*) FROM table3 WHERE table1_id IS NOT NULL AND table1_id = t1.id) AS t3_count
   , (SELECT COUNT(*) FROM table4 WHERE table1_id IS NOT NULL AND table1_id = t1.id) AS t4_count
FROM table1 t1

1 Ответ

1 голос
/ 18 апреля 2019

Наверное, нет. Если вы выполните SELECT COUNT(*) FROM [table], он должен выполнить подсчет PK таблицы. Это должно быть довольно быстро, даже для очень больших столов.

Является ли ваша table4 реальной таблицей (а не представлением, табличной функцией или чем-то еще, похожим на таблицу)? И есть ли у него первичный ключ? Если это так, я не думаю, что производительность запроса SELECT COUNT(*) FROM [table4] может быть значительно увеличена.

Может также случиться, что ваш table4 имеет высокую целевую направленность (в параллельных транзакциях по нескольким соединениям), или, возможно, ваш SQL Server выполняет некоторые тяжелые операции ввода-вывода или вычисления. Я не могу предположить ничего об этом, однако. Вы можете попытаться проверить, не замедлен ли ваш запрос в восстановленной резервной копии базы данных на физически отдельном тестовом сервере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...