[英]SQL query optimization (CTE + range function) in SQL Server 2005
我想知道是否可以優化這種查詢。 我已經極大地簡化了它,您將看到它的核心。
with Rec (Id,Name,ParentId)
as
(
select Id,Name,ParentId from Departments where ParentId is null
union all
select d.Id, d.Name, d.ParentId from Departments d join Rec r on
(d.ParentId=r.Id)
)
select q.* 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
它的作用是按層次查詢下屬部門,然后對其進行調整。
我要制定一個龐大的執行計划,並想知道它是否可以以其他方式完成。
謝謝。
考慮到以下假設,我認為這可能會更好:
可以做什么:為了減少io子系統上的負載,我們可以首先組成一個ID列表,對它們進行分頁(即按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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.