Insertar índice no agrupado

10

Digamos que tengo una mesa 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

Si tuviera que hacer esto:

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

Y ver el plan de ejecución real, solo veo una inserción de índice agrupado . ¿Por qué no veo una inserción de índice no agrupado en el plan de ejecución?


fuente
Supongo que porque hasta que alcances cierto umbral de cardinalidad y recuento de filas, no vale la pena mantener las estadísticas en el índice no agrupado. Si tiene una sola fila en una tabla, el optimizador sabe que no va a usar ese índice, por lo que no lo mantendrá.
JNK
@JNK Pero si hago un select * from SomeTable where String1 = 'foo', entonces veo que el optimizador de consultas de hecho elige el índice IX_SomeString1para una búsqueda de índice. Entonces debe estar actualizando ese índice, ¿no?
1
Puedes ver las estadísticas y ver. También puede ser una deficiencia en la visualización del plan de ejecución. ¿Has revisado el xml?
JNK
1
SQL Server puede usar un plan amplio o estrecho dependiendo de cuántas filas se vean afectadas. Esto controla si las operaciones de mantenimiento del índice se realizan por separado y se muestran en el plan como operaciones separadas o juntas y se muestran como parte de la operación de CI.
Martin Smith
1
@MartinSmith Gran explicación y no lo sabía. Gracias por el enlace y comentario. Esa debería ser una respuesta, creo.

Respuestas:

9

Para una inserción de una sola fila, obtiene un plan estrecho / por fila

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

Plan estrecho

Si selecciona el Operador de inserción de índice agrupado y ve la ventana de propiedades, puede ver la misma información que se muestra en el XML.

Ventana de propiedades

Si lo intentas por 1,000 filas

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

Obtiene un plan ancho / por índice diferente con las operaciones divididas por separado

Plan amplio

Vea Wide vs. Narrow Plans o el blog de Craig Freedman para obtener más información sobre los dos

Martin Smith
fuente
6

Nunca confíes en la visualización del plan gráfico, es solo para novatos. Los profesionales siempre miran el XML. La operación NC está ahí:

<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
fuente
55
No diría que es "solo para novatos" por un largo tramo.
Dave Markle
Mi comentario 'newb' no se trata de la habilidad del espectador, se trata de la experiencia: aquellos que habían sido quemados por las 'omisiones' liberales de los planes gráficos saben mejor que confiar en él. Esto se aplica aún más a los gráficos de punto muerto .
Remus Rusanu