簡體   English   中英

SQL Server 2005中的SQL查詢優化(CTE +范圍函數)

[英]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

它的作用是按層次查詢下屬部門,然后對其進行調整。

我要制定一個龐大的執行計划,並想知道它是否可以以其他方式完成。

謝謝。

考慮到以下假設,我認為這可能會更好:

  1. 您通過ParentId擁有正確的索引
  2. 您從表中檢索了很多數據(大多數列)

可以做什么:為了減少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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM