Nuestro proyecto ejecuta una base de datos muy grande y muy complicada. Entonces, hace aproximadamente un mes, notamos que el espacio utilizado por las columnas indexadas que contenían valores nulos se estaba volviendo demasiado grande. Como respuesta a eso, escribí un script que buscaría dinámicamente en todos los índices de una sola columna que contengan más del 1% de los valores nulos, luego descartaría y volvería a crear esos índices como índices filtrados con la condición de que el valor NO fuera NULL. Esto eliminaría y recrearía cientos de índices en toda la base de datos y, por lo general, liberaría casi el 15% del espacio utilizado por toda la base de datos.
Ahora tengo dos preguntas sobre esto:
A) ¿Cuáles son las desventajas de usar índices filtrados de esta manera? Supongo que solo mejoraría el rendimiento, pero ¿hay algún riesgo de rendimiento involucrado?
B) Recibimos errores ( 'no se puede eliminar el índice XYZ porque no existe o no tiene permiso' ) al soltar y volver a crear los índices, aunque cuando se verificó después, todo había salido exactamente como se esperaba. ¿Cómo puede pasar esto?
¡Gracias por cualquier ayuda!
Editar: en respuesta a @Thomas Kejser
Hola y gracias, pero resulta que fue un desastre. En ese momento no entendíamos varias cosas como:
- Durante una consulta, SQLOS realiza planes de índice antes de determinar que no puede usar valores NULL para unir columnas de tabla. Es decir, realmente necesita tener un filtro de cláusula WHERE que se ajuste al índice para todos y cada uno de los índices filtrados utilizados en la consulta, o el índice no se utilizará en absoluto.
- Dejar caer y crear índices y actualizar de forma redundante sus estadísticas una vez más después aún puede no ser suficiente para producir los planes actualizados, lo que asumimos que lo harían. Parece que en algunos casos solo una carga de trabajo lo suficientemente alta obligará a SQL Server a reevaluar los planes.
- Hay algunas características exóticas de la funcionalidad del planificador de ejecución que son difíciles de determinar solo por el sentido común y la lógica. Incluso con miles de variaciones generadas por código subyacente de diferentes consultas, los índices aparentemente inútiles pueden ayudar en algunas estadísticas y planes de consulta que terminan siendo utilizados en consultas críticas.
Al final, estos cambios fueron revertidos. Por lo tanto, los índices filtrados son una herramienta poderosa, pero debe comprender realmente exactamente qué datos se obtienen de esas columnas. Donde los índices normales aparte de los problemas de espacio son bastante fáciles de aplicar, los índices filtrados representan soluciones muy personalizadas. Ciertamente no son un reemplazo para un índice regular, sino una extensión para ellos en esas circunstancias especiales que se requieren.