1

そのようなクエリが最適化される可能性があるかどうか疑問に思っています。私はそれを大幅に単純化しました。あなたはそれの核心を理解しています。

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

それが行うことは、下位の部門を階層的に照会し、それに対して範囲を設定することです。

私は巨大な実行計画に行き着いており、別の方法でそれを行うことができるかどうか疑問に思っています.

ありがとうございました。

4

1 に答える 1

1

次の仮定を考えると、もう少し良くなる可能性があります。

  1. ParentId による適切なインデックスがあります
  2. テーブルから大量のデータ (ほとんどの列) を取得する

できること: io サブシステムの負荷を軽減するために、最初に Id のリストを作成し、それらをページング (つまり、RowNumber でフィルター処理) し、その後でのみ他のすべての列を含めることができます。これにより、上記の 2 つの仮定を考えると、はるかに高速になるはずの 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
于 2009-08-06T14:21:57.657 に答える