У меня есть довольно сложный запрос в SQL Server, работающий с представлением, в форме:
SELECT *
FROM myview, foo, bar
WHERE shared=1 AND [joins and other stuff]
ORDER BY sortcode;
План запроса, показанный выше, показывает операцию Sort
непосредственно перед последним SELECT
, чего я и ожидал. Всего 35 совпадающих записей, и запрос занимает менее 2 секунд.
Но если я добавлю TOP 30
, запрос займет почти 3 минуты! Использование SET ROWCOUNT
так же медленно.
Глядя на план запроса,теперь кажется, что он сортирует все 2+ миллиона записей в myview
перед объединениями и фильтрами.
Эта «сортировка» отображается в плане запроса как сканирование индекса в коде сортировки
индекс, поиск кластерного индекса в основной таблице и вложенный цикл между ними, все перед объединениями и фильтрами.
Как заставить SQL Server выполнить SORT
непосредственно перед TOP
, как это происходит, когда TOP
не указан?
Я не думаю, что конструкция myview
является проблемой, но на всякий случай это примерно так:
CREATE VIEW myview AS
SELECT columns..., sortcode, 0 as shared FROM mytable
UNION ALL
SELECT columns..., sortcode, 1 as shared FROM [anotherdb].dbo.mytable
Локальная mytable
имеет несколько тысяч записей, а mytable
в другой базе данных в том же экземпляре MSSQL имеет несколько миллионов записей. Обе таблицы имеют индексы в соответствующем столбце sortcode
.