SELECT TOP работает медленно, независимо от ORDER BY

У меня есть довольно сложный запрос в 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 .

22
задан richardtallent 9 June 2011 в 00:31
поделиться