2009-07-21 11 views
19

SQL 2000
Die NED Tabelle hat einen Fremdschlüssel für die NED.RowID SIGN Tabelle
Die SIGN-Tabelle hat einen Fremdschlüssel auf die Tabelle NED SIGN.SignID zu NED.SignID
Die RowID und SignID SIGN.RowID sind gruppierten Primärschlüssel, die GUIDs (nicht meine Wahl)
die WHERE-Klausel ist, ist:Warum wird mein Clustered-Index gescannt?

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  

Warum gibt es einen Index-Scan auf der SIGN-Tabelle für diese Abfrage? Was würde einen Index-Scan für einen gruppierten Index verursachen? Danke

+0

Ich muss fragen, was Sie von dieser Abfrage erwarten oder warum Sie denken, dass ein Index-Scan in diesem Fall ein Problem ist? – Welbog

+0

Kommen Sie von einem anderen DBMS und erwarten etwas wie einen Hash-Join oder Cluster-Join? Wenn ja, sollten Sie beachten, dass ein gruppierter Index in SQL Server einfach ein Strukturindex ist, bei dem die Blattknoten die Datenseiten sind. Wenn Sie das bereits wussten, ignorieren Sie diesen Kommentar. – kdgregory

Antwort

14

Weil Ihre WHERE-Klausel nicht gegen indizierte Spalten ist.

+5

Das stimmt, aber es erklärt eigentlich nichts. –

+2

Aber es beantwortete seine Frage. :) – MyItchyChin

+0

Er hat nicht erwähnt, welche Indizes er hatte. Aber es ist eine gültige und allgemeine Annahme. – Suncat2000

22

Ein Clustered-Index-Scan bezeichnet, wie SQL Server einen vollständigen Tabellenscan für eine Tabelle mit einem gruppierten Index angibt. Dies liegt daran, dass Sie nicht genügend Indizes für die SIGN-Tabelle haben, um die WHERE-Klausel zu erfüllen, oder weil die SIGN-Tabelle klein genug ist (oder die Indizes nicht selektiv genug), dass ein Tabellenscan effizienter wäre.

Wenn Sie die Abfrage untersuchen, müssen Sie wahrscheinlich die Spalte DeptID sowie eine Kombination aus StartTime, EndTime und NEDStatusID indexieren, um den Tabellenscan zu vermeiden. Wenn der Grund, warum Sie Fragen haben, auf Leistungsproblemen zurückzuführen ist, können Sie auch den Indexoptimierungsassistenten (jetzt der Datenbankoptimierungsratgeber in den SQL2005 + -Clienttools) ausführen und Hinweise dazu geben, welche Indizes schnell erstellt werden sollen up Ihre Anfrage.

2

Sie haben mehrere Einschränkungen für die SIGN Ein Tisch, wenn ich das richtig gelesen:

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

eine dieser Beschränkungen sind (wie DeptID, Startzeit, Endzeit, NEDStatusID) indiziert? Wie gut wählen diese Felder aus Ihrer Datenmenge aus?

Wenn Sie 10 Mio. haben. Zeilen und NEDStatusID hat nur 10 mögliche Werte, dann würde jede Beschränkung für dieses Feld immer ungefähr ergeben. 1 Mio. Zeilen - in diesem Fall könnte es einfacher (und weniger kostspielig) für SQL Server sein, einen vollständigen Tabellenscan durchzuführen (Clustered-Index-Scan), insbesondere wenn zusätzliche WHERE-Klauseln für dieselbe Tabelle überprüft werden müssen, die nicht indiziert sind , entweder (StartTime, EndTime usw.).

Marc

Verwandte Themen