2012-05-11 15 views
9

Para tablas 'grandes', ¿hay alguna razón para no poner un filtro en índices para columnas opcionales?Índices filtrados de SQL: ¿debería poner siempre un filtro en un índice para columnas opcionales?

Por lo tanto, para un índice en la columna AAA (porque las personas pueden buscar en AAA),
Puedo establecer el filtro en ([AAA] IS NOT NULL).
Esto ahorra almacenamiento, por lo que ahorra dinero.

algunas ventajas más de technet:

  • rendimiento y la calidad del plan de consulta mejorada
  • Reducción de los costes de mantenimiento de índices
  • Reducción de los costes de almacenamiento Índice

La gente dice que es bueno para poner una filtrar en un índice para columnas que en su mayoría están vacías. ¿Pero por qué no pondré un filtro en los índices de las columnas que están vacías por un 1%? ¿Hay alguna razón para no hacerlo si solo tiene ventajas?

Respuesta

5

Esto es generalmente una buena idea con dos trampas:

  1. El diseñador de tablas tiene un error (sólo pre Denali!). Cuando reconstruye una tabla, elimina todos los filtros.
  2. Asegúrese de que el optimizador puede decir que su forma estática predicado nunca permitirá filas nulos a ser devueltos. Por lo general, este es el caso debido a la semántica SQL NULL (el único caso donde ayudan en lugar de dificultar). Ejemplo: select distinct col from T no usará el índice porque se puede encontrar un valor nulo. Use esto: select distinct col from T where col is not null.

índices filtrados son enormemente infrautilizadas. Incluso se pueden usar para hacer que una columna con nulos sea única.

Mi recomendación práctica: hay que probarlo para unos pocos meses y aprender por sí mismo si hay problemas imprevistos adicionales.

Si usted está en técnicas avanzadas de consulta de SQL Server, también se ven de visitas indexado. Son un súper conjunto de índices filtrados (al menos en Enterprise).

+1

+1 para respuestas directas, y una sugerencia nula y distinta. –

0

Todos los índices tienen ventajas y desventajas: Desventajas:

  1. que ocupan espacio en disco
  2. que necesitan para mantenerse (el equilibrio de el árbol del índice necesita ser reorgansised periódicamente para asegurar que cualquier la optimización de consultas no está utilizando la distribución de datos bum) que puede significa que deben retirarse de la línea - malas noticias si están ocupadas
  3. necesitan tiempo para actualizar sobre la marcha si hay insertos frecuentes

Ventajas:

  1. se diseñan adecuadamente, pueden eliminar los recorridos de tablas caros
  2. se diseñan adecuadamente, (un índice de cobertura) que pueden elimiate cualquier mesa de lectura.

Por lo general, depende de usted.

  1. Demasiados índices pueden dramáticamente lento performanace escritura
  2. Demasiados índices pueden aumentar drásticamente el consumo de dispace
  3. No es el índice derecho drásticamente puede disminuir el rendimiento de lectura

Algunas personas hacen una muy buena vida de conocer realmente sus cosas sobre los índices: Hay cosas muy buenas aquí http://www.insidesqlserver.com/

Por lo tanto, depende de la frecuencia con la que los usuarios devuelven los datos referenciados por el índice y de la frecuencia con que están actualizando los datos contenidos a través del índice.

Los índices para columnas dispersas no son diferentes, sin embargo, cuando la columna está (en gran parte) vacía, los índices filtrados son más eficientes. Una vez que la reserva disminuye (por ejemplo, 50/50), la distribución de los datos puede volverse muy importante cuando el optimizador decide cuál es el mejor plan para devolver los datos.Un índice filtrado no conocerá la distribución de los datos fuera del filtro, algo obvio, pero debe decirse.

+2

creo que se ha perdido el punto de la cuestión. No se trata de índices en general, se trata de filtros en índices. Le quita la desventaja de ocupar espacio en el disco, etc. –

+0

Disculpe, traté de señalar que cuando se considera en general tener un índice, las consideraciones generales comienzan en el mismo lugar. Densidad de datos, lecturas vs escrituras, etc. El resultado debe ser índice/sin índice y, si es índice, escriba índice. También puede usar los procesos almacenados de índice faltante/no utilizado para ajustar el rendimiento a medida que pasa el tiempo y cambia la distribución de datos. Un índice filtrado ocupa más espacio que ningún índice, menos espacio que un índice no filtrado. ¡No estoy tratando de comenzar una guerra! –

+0

Así que ahora mi pregunta: ¿Usted dice "donde la columna es en gran parte vacías índices y después se filtró son más eficientes" -> ¿Por qué no iba a poner un filtro en un índice para una columna que no es más que vacío por 5%, o incluso como el 1%? (Todavía podría ser como 500000 filas, por lo que ahorra almacenamiento.) –

Cuestiones relacionadas