Columna incluida versus índice filtrado

11

Actualmente trabajamos con la tabla llamada tb_tranfers . Esta tabla tiene 40 millones de filas y tiene un tamaño de ~ 26 GB (datos de 11 GB, índices de 15 GB).

Del 10 al 15% de las filas son filas eliminadas temporalmente ( DeletedDate no es nulo). La aplicación solo usa filas donde DeletedDate es nulo. Todas las consultas a esta tabla incluirán una cláusula a tal efecto.

Hay 15 índices en esta tabla. El índice DMV que falta contiene sugerencias para crear índices con DeletedDate como una columna incluida.

¿Sería útil usar un índice filtrado WHERE DeleteDdate IS NULLen los 11 índices no agrupados? ¿O sería mejor tener la columna DeletedDate como una columna incluida?

Paul White 9
fuente

Respuestas:

12

Sí, CREATE INDEX ... ON ... WHERE DeletedDate IS NULLsería útil modificar los 11 índices NC para que sean índices filtrados ( ). De esta manera obtienes dos ventajas:

  • El optimizador de consultas sabrá que cualquier fila procedentes de estos índices ya no satisfacer sus filtros de consulta en DeletedDate, por lo que no tendrá que buscar el índice agrupado volver a comprobar el DeletedDate
  • Todos los índices NC serán de un 10-15% más pequeños, lo que requerirá menos memoria y menos operaciones de E / S para buscar.

La desventaja es que cualquier consulta que se ocupe de las filas eliminadas de software (y debe haber alguna consulta, de lo contrario, ¿por qué existen las filas?) No podrá utilizar estos índices NC.

Remus Rusanu
fuente
7

Si SIEMPRE usa el DeletedDate IS NULLfiltro en sus consultas, entonces sí, probablemente verá un aumento significativo en el rendimiento al agregar el filtro.

Hay muchas menos páginas que el motor debe verificar para encontrar las filas relevantes, lo que significa menos E / S (y más velocidad).

Agregarlo como un INCLUDEDcampo sería inútil . Como siempre lo incluye en el filtro (pero probablemente nunca lo agregue a la lista SELECT), ese campo nunca se referenciará si lo agrega como un INCLUDE.

JNK
fuente
2

Como el 85-90% de las filas tienen DeletedDate son NULL, es poco probable que la selectividad de un índice que consista solo en DeletedDate sea suficiente para que SQL use este índice. Sin embargo, usado junto con otras columnas más selectivas, agregar DeletedDate a los índices existentes debería proporcionar algún beneficio si aumenta la selectividad general del índice.

Como dice JNK, DeletedDate sería de poca utilidad para cubrir índices a menos que lo use en la cláusula SELECT.

Dado que ya hay más almacenamiento para los índices que para los datos, es posible que también desee ver si hay alguna redundancia en los 15 índices NC existentes.

StuartLC
fuente