Как оптимизировать этот запрос - PullRequest
2 голосов
/ 19 февраля 2011

Я изучаю MS SQL Server 2008 R2, поэтому прошу прощения за мое невежество.Этот запрос занимает 3 секунды, и я хотел бы сделать это менее чем за 1 секунду.запрос только для целей тестирования, в действительности я бы присоединился к разным полям.

select * from
(
select row_number() over(order by t1.id) as n, t1.id as id1, t2.id as id2, t3.id as id3, t4.id as id4, t5.id as id5
from dbo.Context t1
inner join dbo.Context t2 on t1.id = t2.test
inner join dbo.Context t3 on t2.id = t3.test
inner join dbo.Context t4 on t3.id = t4.test
inner join dbo.Context t5 on t4.id = t5.test
) as t
where t.n between 950000 and 950009;

Боюсь, что это будет хуже к тому времени, когда в этой таблице будет несколько миллиардов записей.

Нужно ли включать многопоточность из конфигурации или что-то еще?

Ответы [ 2 ]

0 голосов
/ 02 марта 2011

Я бы предложил создать внутренний запрос в виде индексированного представления, а затем запустить свой пейджинг без него.Поскольку индексированное представление фактически имеет реальный индекс, можно использовать те же приемы оптимизации, которые работают с таблицами.

См. здесь для получения дополнительной информации об индексированных представлениях, включая ограничения.

0 голосов
/ 20 февраля 2011

Нет реального способа оптимизировать часть paging такого запроса, часть, которая является

t.n between 950000 and 950009

Что на самом деле

{ ROW_NUMBER } between 950000 and 950009

Без полной материализации ВНУТРЕННИХ СОЕДИНЕНИЙ невозможно точно определить номер строки в результате. Это не похоже на одну таблицу с Row_Number - оптимизатор запросов иногда может просто посчитать индексные ключи и перейти к прямому диапазону.

Единственное, что вы можете сделать, это убедиться, что все условия JOIN полностью проиндексированы и имеют индексы, включающие столбцы, которые будут выбраны (чтобы они стали ИНДЕКСАМИ ПОКРЫТИЯ). Нет смысла показывать особенности, так как это не ваши настоящие столбцы.

Нужно ли включать многопоточность из конфигурации или что-то в этом роде?

По умолчанию параллелизм [уже] включен, поэтому такой запрос, скорее всего, соберет данные в несколько потоков.

...