Некластеризована вставка індексу


10

Скажіть, у мене така таблиця:

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

Якби я це робив:

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

І переглядаючи фактичний план виконання, я бачу лише вставку індексу кластера . Чому я не бачу некластеризованої вставки індексу в плані виконання?


Я здогадуюсь, тому що, поки ви не досягнете певної вагомості та порогу нарахування рядків, підтримувати статистику некластерного індексу не варто. Якщо у вас є один рядок у таблиці, оптимізатор знає, що не збирається використовувати цей індекс, тому він не підтримує його.
JNK

@JNK Але якщо я це зробити select * from SomeTable where String1 = 'foo', то я бачу, що оптимізатор запитів насправді вибирає індекс IX_SomeString1для пошуку індексу. Отже, це має бути оновлення цього індексу, ні?

1
Ви можете подивитися статистику для цього і побачити. Це може бути і недоліком у відображенні плану виконання. Ви перевірили xml?
JNK

1
SQL Server може використовувати широкий або вузький план залежно від кількості рядків. Це контролює, чи операції з обслуговування індексу відбуваються окремо і відображаються в плані як окремі операції або разом і відображаються як частина операції CI.
Мартін Сміт

1
@MartinSmith Чудове пояснення, і я цього не знав. Дякуємо за посилання та коментар. Я повинен вважати, що це відповідь.

Відповіді:


9

Для вставки одного рядка ви отримуєте вузький план / за рядком

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

Вузький план

Якщо ви вибрали оператор Вставити індекс кластера та переглянете вікно властивостей, ви зможете побачити ту саму інформацію, що і в XML.

Вікно властивостей

Якщо ви спробуєте на 1000 рядів

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

Ви отримуєте інший широкий / за індексом план, при цьому операції розділяються окремо

Широкий план

Додаткову інформацію про них див. У розділі Широкі проти Вузьких планів або в блозі Крейга Фрідмана


6

Ніколи не довіряйте графічному відображенню плану, це лише для новачків. Плюси завжди дивляться на XML. Операція НК саме там:

<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" />

5
Я б не сказав, що це "тільки для новачків" на великій відстані.
Дейв Маркл

Мій коментар "newb" - це не вміння глядача, а досвід: ті, хто був спалений ліберальними "упущеннями" графічних планів, знають краще, ніж довіряти йому. Це ще більше стосується тупикових графіків .
Рем Русану
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.