Ambas tablas tienen la misma estructura y 19972 filas en cada tabla. para practicar la indexación, creé ambas tablas con la misma estructura y creé
clustered index on persontb(BusinessEntityID)
y
nonclustered index on Persontb_NC(BusinessEntityId)
y estructura de la mesa
BusinessEntityID int
FirstName varchar(100)
LastName varchar(100)
-- Nonclusted key on businessentityid takes 38%
SELECT BusinessEntityId from Persontb_NC
WHERE businessentityid BETWEEN 400 AND 4000
-- CLustered key businessentityid takes 62%
SELECT BusinessEntityId from persontb
WHERE businessentityid BETWEEN 400 AND 4000
¿Por qué el índice agrupado toma 62% y el 38% no agrupado?
Respuestas:
Sí, el índice agrupado tiene menos filas por página que el índice no agrupado ya que las páginas de hoja del índice agrupado deben almacenar los valores para las otras dos columnas (
FirstName
yLastName
).Las páginas de hoja del NCI almacenan solo los
BusinessEntityId
valores y un localizador de filas (RID si la tabla es un montón o la clave CI de lo contrario).Por lo tanto, los costos estimados reflejan el mayor número de lecturas y el requisito de IO.
Si declararas al NCI como
entonces sería similar al índice agrupado.
fuente
El índice agrupado contiene no solo datos del índice de columna activado, sino también datos de todas las demás columnas. (Solo puede haber un índice agrupado por tabla)
El índice no agrupado contiene solo datos de la (s) columna (s) indexada (s) y un puntero row_id a donde está el resto de los datos.
Por lo tanto, este índice no agrupado en particular es más ligero y se requiere menos lectura para escanearlo / buscarlo y esta consulta en particular funcionará más rápido.
Sin embargo, si ha intentado recuperar FirstName y LastName también, sería diferente y el índice agrupado debería funcionar mejor.
fuente
Los porcentajes entre los planes de consulta no tienen sentido para comparar directamente. Debe comparar las consultas para tener una comparación válida. Además, los recuentos de filas pequeñas tienden a ocultar las diferencias de rendimiento entre las estrategias de indexación. Al aumentar el recuento de filas a 10 millones, puede obtener una imagen más clara de las diferencias de rendimiento.
Hay un script de muestra que crea 3 tablas, las dos de arriba y una tercera con un índice agrupado y no agrupado.
Rellene las tablas con 10 millones de filas.
Podemos usar sys.dm_db_index_physical_stats para ver el tamaño en el disco de los índices.
Y los resultados:
El índice agrupado de T1 es de alrededor de 1,6 GB de tamaño. El índice no agrupado de T2 es de 170 MB (90% de ahorro en IO). El índice no agrupado de T3 es de 97 MB, o aproximadamente un 95% menos de IO que T1.
Entonces, basado en el IO requerido, el plan de consulta original debería haber estado más en la línea del 10% / 90%, no del 38% / 62%. Además, dado que es probable que el índice no agrupado se ajuste completamente en la memoria, la diferencia puede ser aún mayor, ya que el disco IO es muy costoso.
fuente
10%/90%
figura es más precisa que la38%/62%
. Las cadenas con una longitud entre 100 y 200 serán una gran sobreestimación de los requisitos de espacio para un par de nombre / apellido, por lo que tendrá una densidad de página menor que el OP. Cuando intento contra sus datos de ejemplo, los costos estimados se muestran como 87% / 13% .data_pages
insys.allocation_units
. Puede ver esto desdeCREATE TABLE T1(C INT);CREATE TABLE T2(C INT);UPDATE STATISTICS T1 WITH PAGECOUNT = 1;UPDATE STATISTICS T2 WITH PAGECOUNT = 100
entonces comparando los costos estimadosSELECT * FROM T1;SELECT * FROM T2;