Я уверен, что это могло бы быть немного лучше, учитывая следующие предположения:
- У вас есть правильный индекс по ParentId
- Вы извлекаете много данных (большинство столбцов) из таблицы
Что можно сделать: чтобы уменьшить нагрузку на подсистему io, мы можем сначала составить список идентификаторов, пролистать их (т.е. отфильтровать по RowNumber) и только после этого включить все остальные столбцы. Это эффективно приведет к работе с индексом по ParentId, который должен быть намного быстрее, учитывая два вышеупомянутых предположения.
Итак, вот мое предложение «лично», так сказать:
with Rec (Id,ParentId)
as
(
select Id,ParentId from Departments where ParentId is null
union all
select d.Id, d.ParentId from Departments d join Rec r on
(d.ParentId=r.Id)
),
Paged
as
(
select * from (
select ROW_NUMBER() OVER (ORDER BY r.Id DESC) AS [ROW_NUMBER], r.* from Rec r
) as q
where q.[ROW_NUMBER] between 100 and 200
)
select *
from
Paged
inner join Departments d on d.Id = Paged.Id