2009-07-21 9 views
19

SQL 2000
NEDテーブルはSIGN.RowIDするSIGNテーブルNED.RowIDへの外部キーを持つ
SIGNテーブルがNED.SignID
ROWIDおよびSIGNIDにNEDテーブルSIGN.SignIDへの外部キーを持っていますGUIDは(ない私の選択)しているクラスタ化された主キーがある句がある
ザ・:クラスタ化インデックスにスキャンがあるのはなぜですか?

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テーブル上のインデックススキャンはありますか?クラスタ化されたインデックスでインデックススキャンを実行する原因は何ですか?ありがとう

+0

このクエリで期待していること、またはこの場合インデックススキャンが問題だと思うのはなぜですか? – Welbog

+0

別のDBMSから来て、ハッシュ・ジョインやクラスタ・ジョインのようなものが見られることを期待していますか?はいの場合、SQL Serverでは、クラスタ化インデックスは単にリーフノードがデータページであるツリーインデックスであることに注意してください。既に知っている場合は、このコメントを無視してください。 – kdgregory

答えて

9

ここではSQL Serverがインデックス/テーブルスキャンにインデックスから「転換点」とスイッチをシーク達したときの良いブログ記事です:

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

あなたがしたいことは、あなたのクエリがフィルタリングしている様子を見てください。チッピングポイントは、多くの場合、人々が期待するよりもはるかに少ない行です。

14

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

+5

これは本当ですが、実際には何も説明していません。 –

+2

しかし、彼の質問に答えました。 :) – MyItchyChin

+0

彼は彼が持っていたインデックスについて言及しなかった。しかし、これは有効かつ共通の前提です。 – Suncat2000

22

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

クエリを調べるだけで、テーブルスキャンを避けるために、DeptID列とStartTime、EndTime、NEDStatusIDの何らかの組み合わせをインデックスする必要があります。インデックスのチューニングウィザード(SQL2005 +クライアントツールのDatabase Engine Tuning Advisor)を実行し、どのインデックスを作成して高速化するかについてのアドバイスをもらうことができますあなたの質問をアップしてください。

2

あなたはSIGNテーブルの上にいくつかの制限がありますが、私はこれを正しく読んでいる場合:

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

は(DEPTID、のStartTime、終了時間、NEDStatusIDなど)、これらの制限のいずれかがインデックス化されていますか?あなたのデータセットからそれらのフィールドをどれだけうまく選択できますか?

10mioがある場合。 NEDStatusIDには10個の値しか指定できません。そのフィールドの制限は常に約20分です。 1ミリオ。行 - この場合、SQL Serverが完全なテーブルスキャン(クラスタ化インデックススキャン)を行うほうが簡単です(コストがかかりません)。特にインデックスされていない同じテーブルの追加のWHERE句もチェックする必要がある場合、どちらか(StartTime、EndTImeなど)。

マルク・

関連する問題