7

次のクエリがあります

select top 25
    tblSystem.systemName,
    tblCompany.name
from 
    tblSystem
    join tblCompany
        on tblSystem.fkCompanyID = tblCompany.pkCompanyID
order by
    tblSystem.systemName, 
    tblCompany.name

それorder by

ここに画像の説明を入力
は図の最初の実行計画を生成し ます.TOP N SortTOP

4

2 に答える 2

7

tblSystem含まれている上systemNameにインデックスを追加しますfkCompanyID

create index IX_tblSystem_systemName 
  on tblSystem(systemName) include(fkCompanyID)

tblSystemクエリを書き直して、次で並べ替えられた派生テーブルから最初の 25 個の値 (引き分け) を選択しsystemName、結合しtblCompanyて必要な 25 個の値を取得します。

null 値を許可するかどうかに応じてfkCompanyID、派生テーブルの where 句で null 値を除外する必要があります。

select top (25)
  S.systemName,
  C.name 
from (
     select top (25) with ties
       S.fkCompanyID,
       S.systemName
     from tblSystem as S
     where S.fkCompanyID is not null
     order by S.systemName
     ) as S
  inner join tblCompany as C
    on S.fkCompanyID = C.pkCompanyID
order by S.systemName,
         C.name

それでも top(n) ソート演算子を使用する必要がありますが、結合された派生テーブルから取得した 25 行 (+ タイ) のみをソートしますtblCompany

ここに画像の説明を入力

于 2013-11-14T17:19:32.437 に答える
1

systemName ASC、name ASC で既にソートされている行を含むカバリング インデックスを使用することで、それを取り除くことができるかもしれませんが、マイクロ最適化を行っているのではないかと疑っています。このクエリは遅いですか? 高速であれば、「トップ N ソート」に「半分の時間」かかるという事実はあまり重要ではありません。遅い場合は、インデックス スキャンが 4% と表示されていても、もっと気になるでしょう。

于 2013-11-14T16:13:38.303 に答える