Insertion d'index non clusterisé

10

Disons que j'ai une table comme celle-ci:

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

Si je devais faire ceci:

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

Et afficher le plan d'exécution réel, je ne vois qu'un insert d'index clusterisé . Pourquoi ne vois-je pas d' insertion d'index non clusterisé dans le plan d'exécution?


la source
Je suppose que jusqu'à ce que vous atteigniez un certain seuil de cardinalité et de nombre de lignes, cela ne vaut pas la peine de maintenir les statistiques sur l'index non cluster. Si vous avez une seule ligne dans une table, l'optimiseur sait qu'il ne va pas utiliser cet index, donc il ne le maintient pas.
JNK
@JNK Mais si je fais un select * from SomeTable where String1 = 'foo', alors je vois que l'optimiseur de requête choisit en fait l'index IX_SomeString1pour une recherche d'index. Il doit donc mettre à jour cet index, non?
1
Vous pouvez regarder les statistiques et voir. Cela peut également être une lacune dans l'affichage du plan d'exécution. Avez-vous vérifié le xml?
JNK
1
SQL Server peut utiliser un plan large ou étroit selon le nombre de lignes affectées. Ceci contrôle si les opérations de maintenance d'index se produisent séparément et sont affichées dans le plan comme des opérations distinctes ou ensemble et apparaissent comme faisant partie de l'opération CI.
Martin Smith
1
@MartinSmith Excellente explication et je ne le savais pas. Merci pour le lien et le commentaire. Cela devrait être une réponse, je crois.

Réponses:

9

Pour un insert à une rangée, vous obtenez un plan étroit / par rangée

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

Plan étroit

Si vous sélectionnez l'opérateur d'insertion d'index clusterisé et affichez la fenêtre des propriétés, vous pouvez voir les mêmes informations que celles affichées dans le XML.

Fenêtre des propriétés

Si vous essayez pour 1000 lignes

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

Vous obtenez un plan large / par indice différent avec les opérations réparties séparément

Plan large

Voir Wide vs. Narrow Plans ou le blog de Craig Freedman pour plus d'informations sur les deux

Martin Smith
la source
6

Ne faites jamais confiance à l'affichage du plan graphique, c'est uniquement pour les débutants. Les pros regardent toujours le XML. L'opération NC est là:

<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
la source
5
Je ne dirais pas que c'est "uniquement pour les débutants" par un long tronçon.
Dave Markle
Mon commentaire «newb» ne concerne pas l'habileté du spectateur, c'est l'expérience: ceux qui ont été brûlés par les «omissions» libérales des plans graphiques savent mieux que de lui faire confiance. Cela s'applique encore plus aux graphiques de blocage .
Remus Rusanu