Nonclustered Index Insert

10

Angenommen, ich habe einen Tisch wie diesen:

create table SomeTable
(
    id int identity(1, 1) not null primary key clustered,
    SomeString1 varchar(50) not null,
    SomeString2 varchar(50) not null
)
go

create nonclustered index IX_SomeString1
on SomeTable(SomeString1)
go

Wenn ich das tun würde:

insert into SomeTable(SomeString1, SomeString2)
values('foo', 'bar')
go

Und wenn Sie den tatsächlichen Ausführungsplan anzeigen, wird nur ein Clustered Index Insert angezeigt . Warum wird im Ausführungsplan keine nicht gruppierte Indexeinfügung angezeigt ?


quelle
Ich vermute, denn bis Sie einen bestimmten Schwellenwert für Kardinalität und Zeilenanzahl erreicht haben, lohnt es sich nicht, die Statistiken für den nicht gruppierten Index beizubehalten. Wenn Sie eine einzelne Zeile in einer Tabelle haben, weiß der Optimierer, dass dieser Index nicht verwendet wird, sodass er nicht verwaltet wird.
JNK
@JNK Aber wenn ich a mache select * from SomeTable where String1 = 'foo', dann sehe ich, dass der Abfrageoptimierer tatsächlich den Index IX_SomeString1für eine Indexsuche auswählt . Also muss es diesen Index aktualisieren, nein?
1
Sie können sich die Statistiken ansehen und sehen. Dies kann auch ein Mangel in der Anzeige des Ausführungsplans sein. Hast du die XML überprüft?
JNK
1
SQL Server kann je nach Anzahl der betroffenen Zeilen entweder einen breiten oder einen schmalen Plan verwenden . Hiermit wird gesteuert, ob die Indexwartungsvorgänge separat ausgeführt werden und im Plan als separate Vorgänge oder zusammen angezeigt werden und als Teil des CI-Vorgangs angezeigt werden.
Martin Smith
1
@ MartinSmith Tolle Erklärung und das wusste ich nicht. Danke für den Link und den Kommentar. Das sollte eine Antwort sein, glaube ich.

Antworten:

9

Für eine einzelne Zeileneinfügung erhalten Sie einen schmalen Plan pro Zeile

INSERT INTO SomeTable(SomeString1, SomeString2)
SELECT TOP 1 type, type
FROM master..spt_values

Enger Plan

Wenn Sie den Operator zum Einfügen von Clustered-Indizes auswählen und das Eigenschaftenfenster anzeigen, werden dieselben Informationen wie im XML angezeigt.

Eigenschaftenfenster

Wenn Sie versuchen, 1.000 Zeilen

INSERT INTO SomeTable(SomeString1, SomeString2)
SELECT TOP 1000 type, type
FROM master..spt_values

Sie erhalten einen anderen Wide / Pro-Index-Plan, bei dem die Vorgänge separat aufgeteilt werden

Breiter Plan

Weitere Informationen zu den beiden finden Sie in Wide vs. Narrow Plans oder in Craig Freedmans Blog

Martin Smith
quelle
6

Vertrauen Sie niemals der grafischen Plananzeige, sondern nur für Neulinge. Profis schauen immer auf das XML. Die NC-Operation ist genau dort:

<Update DMLRequestSort="false">
  <Object Database="[testdb]" Schema="[dbo]" Table="[SomeTable]" Index="[PK__SomeTabl__3213E83F4AAF1C98]" IndexKind="Clustered" />
  <Object Database="[testdb]" Schema="[dbo]" Table="[SomeTable]" Index="[IX_SomeString1]" IndexKind="NonClustered" />
Remus Rusanu
quelle
5
Ich würde nicht sagen, dass es bei weitem "nur für Neulinge" ist.
Dave Markle
In meinem "Newb" -Kommentar geht es nicht um die Fähigkeiten des Betrachters, sondern um Erfahrungen: Diejenigen, die durch die liberalen "Auslassungen" der grafischen Pläne verbrannt wurden, wissen es besser, als ihm zu vertrauen. Dies gilt umso mehr für Deadlock-Diagramme .
Remus Rusanu