Inserção de índice não clusterizado

10

Digamos que eu tenha uma tabela como esta:

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

Se eu fosse fazer isso:

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

E veja o plano de execução real, só vejo uma inserção de índice clusterizado . Por que não estou vendo uma inserção de índice não clusterizada no plano de execução?


fonte
Estou supondo que, até que você atinja um certo limite de cardinalidade e número de linhas, não vale a pena manter as estatísticas no índice não clusterizado. Se você tiver uma única linha em uma tabela, o otimizador sabe que não usará esse índice, portanto não o manterá.
JNK
@JNK Mas se eu fizer um select * from SomeTable where String1 = 'foo', então vejo que o otimizador de consultas realmente escolhe o índice IX_SomeString1para uma busca de índice. Então deve estar atualizando esse índice, não?
11
Você pode olhar para as estatísticas e ver. Também pode ser uma falha na exibição do plano de execução. Você verificou o xml?
JNK
11
O SQL Server pode usar um plano amplo ou restrito, dependendo de quantas linhas são afetadas. Isso controla se as operações de manutenção do índice ocorrem separadamente e são exibidas no plano como operações separadas ou juntas e exibidas como parte da operação do IC.
Martin Smith
11
@ MartinSmith Ótima explicação e eu não sabia disso. Obrigado pelo link e comentário. Essa deveria ser uma resposta, acredito.

Respostas:

9

Para uma inserção de linha única, você obtém um plano estreito / por linha

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

Plano restrito

Se você selecionar o Operador de inserção de índice em cluster e Exibir a janela de propriedades, poderá ver as mesmas informações mostradas no XML.

Janela Propriedades

Se você tentar por 1.000 linhas

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

Você obtém um plano diferente de amplo / por índice com as operações divididas separadamente

Plano amplo

Consulte Wide vs. Narrow Plans ou o blog de Craig Freedman para obter mais informações sobre os dois

Martin Smith
fonte
6

Nunca confie na exibição do plano gráfico, é apenas para iniciantes. Os profissionais sempre olham para o XML. A operação NC está logo ali:

<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
fonte
5
Eu não diria que é "apenas para iniciantes" por um longo período.
Dave Markle
Meu comentário 'newb' não é sobre a habilidade do espectador, é sobre a experiência: aqueles que foram queimados pelas 'omissões' liberais dos planos gráficos sabem mais do que confiar nisto. Isso se aplica ainda mais aos gráficos de deadlock .
Remus Rusanu