Какими бы ни были индексы, у вас слишком много «касаний» к таблице «Документ»: 3 раза на строку в таблице «Отдел». Таким образом, он будет плохо масштабироваться, и оптимизатор не сможет изменить коррелированные подзапросы на JOIN.
Вы можете сделать это одним прикосновением к таблице документов, например, с помощью JOIN
SELECT
D.DepartmentID,
[Description] = D.DepartmentNo + ' (' + D.DepartmentName + ')',
hasInvoice = SIGN(COUNT(CASE WHEN doc.TypeID = 1 THEN 1 END)),
hasCreditNote = SIGN(COUNT(CASE WHEN doc.TypeID = 2 THEN 1 END)),
hasQuote = SIGN(COUNT(CASE WHEN doc.TypeID = 3 THEN 1 END))
FROM
Department D
LEFT JOIN
Document doc ON D.DepartmentID = doc.DepartmentID
ORDER BY
D.DepartmentName, D.DepartmentID, D.DepartmentNo
Вы также можете 3 раза ЛЕВО ПРИСОЕДИНИТЬСЯ к отфильтрованной + агрегированной производной таблице документа или использовать CROSS APPLY 3 раза: но это все еще 3 варианта использования таблицы документа
Вам нужен индекс DepartmentID, TypeID
в Документах для любого решения. Без этого я только переставил шезлонги так сказать
Я предполагаю, что Department.DepartmentID также является кластерным индексом.