Wstawianie indeksu nieklastrowanego

10

Powiedzmy, że mam taki stół:

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

Gdybym to zrobił:

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

I zobacz aktualny plan wykonania, widzę tylko wstawkę indeksu klastrowego . Dlaczego nie widzę Wstawionego indeksu nieklastrowanego w planie wykonania?


źródło
Zgaduję, ponieważ dopóki nie osiągniesz progu liczności i liczby wierszy, nie warto utrzymywać statystyk w indeksie nieklastrowanym. Jeśli masz jeden wiersz w tabeli, optymalizator wie, że nie będzie używał tego indeksu, więc go nie utrzymuje.
JNK,
@JNK Ale jeśli to zrobię select * from SomeTable where String1 = 'foo', to widzę, że optymalizator zapytań faktycznie wybiera indeks IX_SomeString1do wyszukiwania indeksu. Więc to musi być aktualizacja tego indeksu, nie?
1
Możesz spojrzeć na statystyki i zobaczyć. Może to być również niedociągnięcie w wyświetlaniu planu wykonania. Czy sprawdziłeś xml?
JNK,
1
SQL Server może korzystać z szerokiego lub wąskiego planu w zależności od liczby dotkniętych nim wierszy. Kontroluje to, czy operacje konserwacji indeksu odbywają się osobno i są wyświetlane w planie jako osobne operacje, czy razem i pojawiają się jako część operacji CI.
Martin Smith,
1
@MartinSmith Świetne wyjaśnienie i tego nie wiedziałem. Dzięki za link i komentarz. Myślę, że to powinna być odpowiedź.

Odpowiedzi:

9

W przypadku wkładki jednorzędowej otrzymujesz plan wąski / na wiersz

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

Wąski plan

Po wybraniu operatora wstawiania indeksu klastrowanego i wyświetleniu okna właściwości można zobaczyć te same informacje, co pokazano w pliku XML.

Okno właściwości

Jeśli spróbujesz za 1000 wierszy

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

Otrzymujesz inny plan szeroki / na indeks, z oddzielnymi operacjami

Szeroki plan

Zobacz Wide vs. Narrow Plany lub blog Craiga Freedmana, aby uzyskać więcej informacji na temat tych dwóch

Martin Smith
źródło
6

Nigdy nie ufaj wyświetlaniu graficznego planu, jest tylko dla początkujących. Profesjonaliści zawsze patrzą na XML. Operacja NC jest tutaj:

<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
źródło
5
Nie powiedziałbym, że to „tylko dla początkujących”.
Dave Markle,
Mój komentarz „newb” nie dotyczy umiejętności widza, dotyczy doświadczenia: ci, którzy zostali spaleni przez liberalne „pominięcia” planów graficznych, wiedzą lepiej, niż im ufać. Dotyczy to tym bardziej wykresów zakleszczenia .
Remus Rusanu,