Вставка некластерного индекса

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
Я бы не сказал, что это "только для новичков" в течение долгого времени.
Дейв Маркл
Мой комментарий «новичка» не о мастерстве зрителя, а об опыте: те, кто был сожжен либеральными «упущениями» графических планов, знают лучше, чем доверять ему. Это в большей степени относится к графам взаимоблокировок .
Ремус Русану