18

SQL 2000
NEDテーブルにはSIGNテーブルへの外部キーがありますNED.RowID
からSIGN.RowIDSIGNテーブルにはNEDテーブルへの外部キーがありますSIGN.SignIDからNED.SignIDRowID
と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があるのはなぜですか?クラスタ化されたインデックスでインデックススキャンが発生する原因は何ですか?ありがとう

4

4 に答える 4

22

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

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

于 2009-07-21T19:51:08.930 に答える
14

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

于 2009-07-21T19:46:24.633 に答える
9

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

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

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

于 2009-07-24T04:23:04.310 に答える
2

これを正しく読んだ場合、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など)。

マーク

于 2009-07-21T20:25:24.710 に答える