Без этих данных очень сложно работать, но я создал таблицы и продублировал процедуру, чтобы получить общее представление о плане запроса и потенциальных проблемах.
Первая заметная вещь, часть запроса, записанная в виде:
SELECT DISTINCT Aid
FROM Authors EAE
WHERE EAE.[Year] >= @year AND EAE.Email IS NOT NULL AND EAE.Email != ' '
Идет сканирование таблицы, в качестве ключа разделения у вас есть Год, но внутри каждого раздела нет индекса, поддерживающего предложения электронной почты в запросе. Как примечание стороны, EAE.Email! = '' Может не дать вам того, что вы ожидаете.
Если ''! = '' Напечатать 'true', иначе вывести 'false'
Это даст ложь для большинства систем. (На основе данных)
FROM Articles ED
INNER JOIN Authors EAD ON EAD.ArId = ED.ArId
WHERE EAD.Aid = [YearAuthors].Aid AND ED.ClassNumber = @classNumber
ED.ClassNumber не будет иметь поддерживающего индекса, что приведет к сканированию кластеризованного индекса.
В последнем утверждении выбора:
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Авторы EA ON EA.Aid = # TT.Aid
У этого индекса нет поддержки на стороне #TT, и, похоже, он не равен индексу на стороне таблицы авторов.
WHERE EA.Email IS NOT NULL AND EA.Email != ' '
у него нет вспомогательного индекса, что вызывает сканирование.
Там гораздо больше проблем, с появлением значительного числа сортировок, которые, вероятно, исчезнут с подходящими индексами - вам придется разобраться с некоторыми базовыми индексами таблиц, а затем получить новый план / набор запросов проблем и итеративно исправьте план - вы не исправите его одним выстрелом «серебряной пули».