Скажіть, у мене така таблиця:
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для пошуку індексу. Отже, це має бути оновлення цього індексу, ні?
Ви можете подивитися статистику для цього і побачити. Це може бути і недоліком у відображенні плану виконання. Ви перевірили xml?
—
JNK
SQL Server може використовувати широкий або вузький план залежно від кількості рядків. Це контролює, чи операції з обслуговування індексу відбуваються окремо і відображаються в плані як окремі операції або разом і відображаються як частина операції CI.
—
Мартін Сміт


