Имея расчет в вашем сравнении, он может лишить законной силы использование индекса. Обычно это происходит, когда тип данных результата вычисления отличается от типа данных индексируемого столбца. Иногда стоимость расчета велика, если она должна повторяться достаточно много раз (например, из множества соединений). Одним из решений является сохранение рассчитанного значения в специальном столбце, например:
CREATE TABLE TestInstances (
...
nextSchoolYearID int);
И используйте триггер или логику для поддержания nextSchoolYearID = fkSchoolYearID + 1
, затем используйте
ON TestInstances.fkSchoolYearID = TestInstancesPre.nextSchoolYearID)
Кроме того, у вас есть AND StudentTests.pkStudentTestID IN (SELECT * FROM @tempTests)
в предложении on
первого объединения, но значения в @tempTests не связаны ни с одной таблицей.
Попробуйте переместить этот предикат в предложение where в конце, например:
SELECT
...
WHERE StudentTests.pkStudentTestID IN (SELECT * FROM @tempTests)
Это означает, что SELECT * FROM @tempTests
будет выполняться только один раз, вместо того, чтобы выполняться для каждой комбинации строк TestInstances и StudentTests.