「SELECT TOP」パフォーマンスの質問


18

selectを使用するtop 100とはるかに高速に実行され、select を使用しないとはるかに低速になるクエリがありますtop 100。返されるレコードの数は0です。クエリプランの違いについて説明したり、そのような違いが説明されているリンクを共有したりできますか。

topテキストなしのクエリ:

SELECT --TOP 100
*
FROM InventTrans
     JOIN
     InventDim
     ON InventDim.DATAAREAID = 'dat' AND 
        InventDim.INVENTDIMID = InventTrans.INVENTDIMID
WHERE InventTrans.DATAAREAID = 'dat' AND 
      InventTrans.ITEMID = '027743' AND 
      InventDim.INVENTLOCATIONID = 'КзРЦ Алмат' AND 
      InventDim.ECC_BUSINESSUNITID = 'Казахстан';

上記のクエリプラン(なしtop):

https://pastebin.com/cbtJpxFf

ここに画像の説明を入力してください

IOおよびTIME統計(なしtop):

SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 0 ms.

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.
SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 0 ms.

(0 row(s) affected)
Table 'INVENTDIM'. Scan count 0, logical reads 988297, physical reads 0, read-ahead reads 1, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'INVENTTRANS'. Scan count 1, logical reads 1234560, physical reads 0, read-ahead reads 14299, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

(1 row(s) affected)

 SQL Server Execution Times:
   CPU time = 6256 ms,  elapsed time = 13348 ms.
SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 0 ms.

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.

使用されるインデックス(なしtop):

1. INVENTTRANS.I_177TRANSIDIDX
   4 KEYS:
 - DATAAREAID
 - INVENTTRANSID
 - INVENTDIMID
 - RECID
2. INVENTTRANS.I_177ITEMIDX
   3 KEYS:
   - DATAAREAID
   - ITEMID
   - DATEPHYSICAL 
3. INVENTDIM.I_698DIMIDIDX
   2 KEYS:
   - DATAAREAID
   - INVENTDIMID

クエリtop

SELECT TOP 100
*
FROM InventTrans
     JOIN
     InventDim
     ON InventDim.DATAAREAID = 'dat' AND 
        InventDim.INVENTDIMID = InventTrans.INVENTDIMID
WHERE InventTrans.DATAAREAID = 'dat' AND 
      InventTrans.ITEMID = '027743' AND 
      InventDim.INVENTLOCATIONID = 'КзРЦ Алмат' AND 
      InventDim.ECC_BUSINESSUNITID = 'Казахстан';

クエリプラン(TOP付き):

https://pastebin.com/0dyu6QZd

ここに画像の説明を入力してください


クエリIOおよびTIME統計(TOPを使用):

SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 0 ms.

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.
SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 0 ms.

(0 row(s) affected)
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'INVENTTRANS'. Scan count 15385, logical reads 82542, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'INVENTDIM'. Scan count 1, logical reads 62704, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

(1 row(s) affected)

 SQL Server Execution Times:
   CPU time = 265 ms,  elapsed time = 257 ms.
SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 0 ms.

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.

使用されるインデックス(TOP付き):

 1. INVENTTRANS.I_177TRANSIDIDX
     4 KEYS:
     - DATAAREAID
     - INVENTTRANSID
     - INVENTDIMID
     - RECID
 2. INVENTTRANS.I_177DIMIDIDX
    3 KEYS:
    - DATAAREAID
    - INVENTDIMID
    - ITEMID
 3. INVENTDIM.I_698DIMIDIDX
    2 KEYS:
    - DATAAREAID
    - INVENTDIMID
 4. INVENTDIM.I_698ECC_BUSUNITLOCIDX
    3 KEYS
    - DATAAREAID
    - ECC_BUSINESSUNITID
    - INVENTLOCATIONID

トピックに関するヘルプを深く感謝します!


2
「ORDER BY」なしの「TOP」の速度は重要ではないと思います。正しい結果は速度よりも重要です。
ダン・グスマン

回答:


15

SQL Serverは、異なるソートアルゴリズムを使用して、TOP 100の異なる実行プランを構築します。時々それはより速く、時々それはより遅いです。

より簡単な例については、1行でクエリプランをどれだけ変更できますか?を参照してください。パート1パート2

技術的な詳細と、TOP 100アルゴリズムが実際に遅い例については、Paul Whiteの並べ替え、行の目標、TOP 100の問題を参照してください

一番下の行:あなたの場合、行が返されないことがわかっている場合、クエリを実行しないでください。最速のクエリは、決して作成しないクエリです。ただし、存在チェックを行う必要がある場合は、IF EXISTS(ここでクエリを続ける)を行うだけで、SQL Serverはさらに異なる実行計画を実行します。


おかげで、私は間違いなくそれを読みます。また、両方のシナリオで行の見積もりが正しくないことにも気付きました。それは何に関連しているのでしょうか?統計情報に問題がない場合-両方のクラスター化インデックスでfullscanオプションを使用して更新しました。
ジョージK

また、注文がないので、私の場合は適切ですか?SORTは計画に含まれていないと思いますか?
ジョージK

実行計画がTOP 100とTOP 101の両方で同じかどうかを確認することは非常に興味深いでしょう。可能であれば共有してください。ありがとう。
Artashes Khachatryan

@GeorgeK Dynamics AXを使用していることがわかります。トレースフラグ[ blogs.msdn.microsoft.com/axinthefield / ...に注意してください。多くの見積もりの​​問題につながる可能性があります。トレースフラグ4136が無効になっている場合は、インデックスの「パーティション」列が最初かどうかを確認します。パーティションには通常、個別の値がほとんどありません。
ハンスベイダー

9

2つのプランを見ると、大幅に異なる%コストで両方のキールックアップがあります。マウスをオブジェクトの上に置くと、実行回数が表示されます。

キールックアップは、インデックスシーク(右上)で使用されるインデックスがすべての列をカバーしていないため、クラスター化インデックスへのルックアップです(*を選択して、クラスター化インデックスを使用する必要があります)。

Top 100は、インデックスからの読み取り回数を少なくして必要な100行を取得し、テーブル内のすべての行ではなく100回ルックアップを実行できます。また、「トップ」を実行しない場合の読み取りページ数の増加についても説明します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.