Вы говорите
Когда я удаляю TOP или ORDER BY ... он выполняется быстрее
Что означает, что у SQL Server нет проблем с генерацией всего набора результатов в нужном порядке. Это просто идет грушевидной формы с ограничением TOP 10
. Это общая проблема с rowgoals . Когда SQL Server знает, что вам нужны только первые несколько результатов, он может выбрать другой план, пытаясь оптимизировать для этого случая, который может иметь неприятные последствия.
Более поздние версии включают подсказку DISABLE_OPTIMIZER_ROWGOAL
, чтобы отключить это для каждого запроса. В старых версиях вы можете использовать QUERYTRACEON 4138
, как показано ниже.
SELECT TOP (10) A.ColumnValue AS ValueA
FROM TableA AS A
INNER JOIN TableB AS B
ON A.ID = B.ID
WHERE A.DateValue > '1982-05-02'
ORDER BY ValueA
OPTION (QUERYTRACEON 4138)
Вы можете использовать это, чтобы проверить причину, но могут найти разрешения для запуска QUERYTRACEON
, проблема.
В этом случае вы можете скрыть значение TOP
в переменной, как показано ниже
DECLARE @Top INT = 10
SELECT TOP (@Top) A.ColumnValue AS ValueA
FROM TableA AS A
INNER JOIN TableB AS B
ON A.ID = B.ID
WHERE A.DateValue > '1982-05-02'
ORDER BY ValueA
option (optimize for (@Top = 1000000))