web-dev-qa-db-ja.com

クラスター化インデックスにスキャンがあるのはなぜですか?

SQL 2000
NEDテーブルには、SIGNテーブルNED.RowIDからSIGN.RowIDへの外部キーがあります
SIGNテーブルには、NEDテーブルSIGN.SignIDからNED.SignIDへの外部キーがあります
RowIDとSignIDは、GUIDであるクラスター化された主キーです(私の選択ではありません)
WHERE句は次のとおりです。

FROM
    [SIGN] A   
    INNER JOIN NED N ON A.SIGNID = N.SIGNID  
    INNER JOIN Wizard S ON A.WizardID = S.WizardID   
    INNER JOIN [Level] SL ON N.LevelID = SL.LevelID  
    LEFT JOIN Driver DSL ON SL.LevelID = DSL.LevelID  
        AND DSL.fsDeptID = @fsDeptID  
    INNER JOIN [Character] ET ON S.CharacterID = ET.CharacterID  
    INNER JOIN Town DS ON A.TownID = DS.TownID   
WHERE  
    (A.DeptID = @DeptID OR   
    S.DeptID = @DeptID  
    AND   
    A.[EndTime] > @StartDateTime AND A.[StartTime] < @EndDateTime  
    AND   
    A.NEDStatusID = 2    

このクエリのSIGNテーブルにINDEXSCANがあるのはなぜですか?クラスター化インデックスでインデックススキャンが発生する原因は何ですか?ありがとう

18
user142253

SQL Serverが「転換点」に到達し、インデックスシークからインデックス/テーブルスキャンに切り替わる時期についての優れたブログ投稿は次のとおりです。

http://www.sqlskills.com/BLOGS/KIMBERLY/post/The-Tipping-Point-Query-Answers.aspx

転換点は多くの場合、人々が予想するよりもはるかに少ない行であるため、クエリがフィルタリングする方法を確認することをお勧めします。

9
SqlRyan

クラスター化インデックススキャンは、SQLServerがクラスター化インデックスを持つテーブルの全表スキャンを指定する方法です。これは、WHERE句を満たすのに十分なインデックスがSIGNテーブルにないか、またはSIGNテーブルがテーブルスキャンの効率を上げるのに十分小さい(またはインデックスの選択が不十分である)と判断したためです。

クエリを調べるだけで、テーブルスキャンを回避するために、DeptID列と、StartTime、EndTime、およびNEDStatusIDの組み合わせにインデックスを付ける必要があります。パフォーマンスの問題があるために質問している場合は、インデックスチューニングWizard(現在はSQL2005 +クライアントツールのデータベースエンジンチューニングアドバイザー)を実行して、クエリを高速化するために作成するインデックスに関するアドバイス。

22
zinglon

WHERE句はインデックス付きの列に対してではないためです。

14
MyItchyChin

これを正しく読んだ場合、SIGNAテーブルにはいくつかの制限があります。

WHERE  
        (A.DeptID = @DeptID OR   
        S.DeptID = @DeptID  
        AND   
        A.[EndTime] > @StartDateTime AND A.[StartTime] < @EndDateTime  
        AND   
        A.NEDStatusID = 2

これらの制限(DeptID、StartTime、EndTime、NEDStatusIDなど)のいずれかにインデックスが付けられていますか?これらのフィールドは、データセットからどの程度適切に選択されていますか?

あなたが10ミオを持っている場合。行とNEDStatusIDには10個の可能な値しかないため、そのフィールドを制限すると、常に約1ミオ。行-その場合、SQL Serverが全表スキャン(クラスター化インデックススキャン)を実行する方が簡単(かつ低コスト)である可能性があります。特に、同じテーブルでインデックスが作成されていない追加のWHERE句もチェックする必要がある場合はそうです。 、いずれか(StartTime、EndTImeなど)。

マーク

2
marc_s