2009-07-21 74 views
19

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表的索引掃描?什麼會導致聚簇索引上的索引掃描?謝謝

+0

我必須問你對這個查詢有什麼期望,或者你爲什麼認爲在這種情況下索引掃描是一個問題? – Welbog 2009-07-21 19:47:19

+0

你是否來自另一個DBMS,希望看到像散列連接或羣集連接之類的東西?如果是的話,那麼你應該知道在SQL Server中,聚集索引只是一個樹索引,葉節點就是數據頁面。如果您已經知道這一點,那麼請忽略此評論。 – kdgregory 2009-07-21 20:38:57

回答

14

因爲您的WHERE子句不針對索引列。

22

聚簇索引掃描是SQL Server如何在具有聚簇索引的表上指定全表掃描。這是因爲您在SIGN表上沒有足夠的索引來滿足WHERE子句,或者因爲它確定SIGN表足夠小(或者索引不夠選擇)以至於表掃描更有效。

僅通過檢查查詢,您可能必須對DeptID列以及StartTime,EndTime和NEDStatusID的某些組合進行索引以避免表掃描。如果您提出的原因是因爲您遇到性能問題,那麼您還可以運行「索引調整嚮導」(現在是SQL2005 +客戶端工具中的數據庫引擎優化顧問),並提供一些建議以指導創建哪些索引以加快速度打開你的查詢。

2

您對簽署表數的限制,如果我讀這正確:

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

是否有任何的這些限制(如DEPTID,開始時間,結束時間,NEDStatusID)索引?這些字段從您的數據集中進行選擇的能力如何?

如果你有10萬個。行和NEDStatusID只有10個可能的值,那麼對該字段的任何限制總是會產生約。 1 mio。行 - 在這種情況下,對於SQL Server來說,執行全表掃描(聚簇索引掃描)可能會更簡單(並且成本更低),特別是如果它還需要檢查同一個表上未編入索引的其他WHERE子句,(StartTime,EndTIme等)。

馬克

相關問題