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があるのはなぜですか?クラスター化インデックスでインデックススキャンが発生する原因は何ですか?ありがとう
SQL Serverが「転換点」に到達し、インデックスシークからインデックス/テーブルスキャンに切り替わる時期についての優れたブログ投稿は次のとおりです。
http://www.sqlskills.com/BLOGS/KIMBERLY/post/The-Tipping-Point-Query-Answers.aspx
転換点は多くの場合、人々が予想するよりもはるかに少ない行であるため、クエリがフィルタリングする方法を確認することをお勧めします。
クラスター化インデックススキャンは、SQLServerがクラスター化インデックスを持つテーブルの全表スキャンを指定する方法です。これは、WHERE句を満たすのに十分なインデックスがSIGNテーブルにないか、またはSIGNテーブルがテーブルスキャンの効率を上げるのに十分小さい(またはインデックスの選択が不十分である)と判断したためです。
クエリを調べるだけで、テーブルスキャンを回避するために、DeptID列と、StartTime、EndTime、およびNEDStatusIDの組み合わせにインデックスを付ける必要があります。パフォーマンスの問題があるために質問している場合は、インデックスチューニングWizard(現在はSQL2005 +クライアントツールのデータベースエンジンチューニングアドバイザー)を実行して、クエリを高速化するために作成するインデックスに関するアドバイス。
WHERE句はインデックス付きの列に対してではないためです。
これを正しく読んだ場合、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など)。
マーク