sql-server - tiempo - ver consultas en ejecucion sql server
¿Qué hace para asegurarse de que un nuevo índice no ralentice las consultas? (4)
Cuando agregamos o eliminamos un nuevo índice para acelerar algo, podemos terminar desacelerando algo más. Para protegerme contra estos casos, después de crear un nuevo índice, estoy realizando los siguientes pasos:
- iniciar el Perfilador,
- ejecute un script SQL que contiene muchas consultas que no quiero ralentizar
- cargar la traza de un archivo en una tabla,
- analice la CPU, las lecturas y las escrituras de la traza en comparación con los resultados de las ejecuciones anteriores, antes de agregar (o eliminar) un índice.
Esto es algo automatizado y hace lo que quiero. Sin embargo, no estoy seguro de si hay una mejor manera de hacerlo. ¿Hay alguna herramienta que haga lo que quiero?
Edit 1 La persona que votó para cerrar mi pregunta, ¿podría explicar sus razones?
Edit 2 Busqué en Google pero no encontré nada que explique cómo agregar un índice puede ralentizar las selecciones. Sin embargo, este es un hecho bien conocido, por lo que debería haber algo en algún lugar. Si no aparece nada, puedo escribir algunos ejemplos más adelante.
Edición 3 Uno de estos ejemplos es este: dos columnas están altamente correlacionadas, como la altura y el peso. Tenemos un índice de altura, que no es lo suficientemente selectivo para nuestra consulta. Agregamos un índice de peso y ejecutamos una consulta con dos condiciones: un rango en altura y un rango en peso. Debido a que el optimizador no es consciente de la correlación, subestima en gran medida la cardinalidad de nuestra consulta.
Otro ejemplo es agregar un índice al aumentar la columna, como OrderDate, que puede ralentizar seriamente una consulta con una condición como OrderDate> SomeDateAfterCreatingTheIndex.
¿Qué tal el siguiente enfoque?
- Guarda los planes de ejecución de todas las consultas típicas.
- Después de aplicar nuevos índices, verifique qué planes de ejecución han cambiado.
- Probar el rendimiento de las consultas con planes modificados.
Desde la página "Query Performance Tuning"
Mejorar los índices
Esta página tiene muchas sugerencias útiles paso a paso sobre cómo ajustar sus índices para obtener el mejor rendimiento y qué ver (perfilar).
Al igual que con la mayoría de las técnicas de optimización del rendimiento, hay compensaciones. Por ejemplo, con más índices, las consultas SELECT se ejecutarán potencialmente más rápido. Sin embargo, las operaciones de DML (INSERTAR, ACTUALIZAR y BORRAR) se reducirán significativamente porque se deben mantener más índices con cada operación. Por lo tanto, si sus consultas son en su mayoría sentencias SELECT, más índices pueden ser útiles. Si su aplicación realiza muchas operaciones DML, debe ser conservador con el número de índices que cree.
Otros recursos:
Sin embargo, es importante tener en cuenta que los índices no agrupados ralentizan el proceso de modificación e inserción de datos , por lo que los índices deben mantenerse al mínimo.
Los índices y tablas fragmentados en SQL Server pueden ralentizar el rendimiento de la aplicación. Aquí hay un procedimiento almacenado que encuentra índices fragmentados en servidores SQL y bases de datos.
En última instancia, lo que está preguntando puede reformularse como ''¿Cómo puedo asegurarme de que las consultas que ya usan un plan rápido y óptimo no se'' optimicen ''en un plan de ejecución peor?'' .
Si el plan cambia debido a la detección de parámetros, la actualización de estadísticas o los cambios de metadatos (como agregar un nuevo índice), la mejor respuesta que conozco para mantener el plan estable son las guías del plan . Implementar guías de planes para consultas críticas que ya tienen buenos planes de ejecución es probablemente la mejor manera de obligar al optimizador a seguir utilizando el plan bueno y validado. Consulte Aplicación de un plan de consulta fijo a una guía del plan :
Puede aplicar un plan de consulta fijo a una guía de plan de tipo OBJECT o SQL. Las guías de plan que aplican un plan de consulta fijo son útiles cuando conoce un plan de ejecución existente que funciona mejor que el seleccionado por el optimizador para una consulta en particular.
Las advertencias habituales se aplican a cualquier posible abuso de una característica que impide que el optimizador utilice un plan que puede ser mejor que la guía del plan.
Okay . En primer lugar, el índice se ralentiza dos cosas (al menos)
-> Insertar / actualizar / eliminar: reconstrucción del índice
-> planificación de consultas: "¿Debo usar ese índice o no?"
Alguien mencionó que el planificador de consultas podría tomar una ruta menos eficiente, esto no se supone que suceda.
Si su optimizador es medio decente y sus estadísticas / parámetros son correctos, no hay forma de que elija el plan incorrecto.
De cualquier manera, en su caso (mssql), difícilmente puede confiar en el optimizador y aún tendrá que comprobarlo cada vez.
Lo que está haciendo actualmente parece bastante sensato, solo debe asegurarse de que los datos que está viendo sean relevantes, es decir, consultas de casos de uso real en la proporción correcta (esto puede hacer una gran diferencia).
Para hacer eso siempre aconsejo escribir un guión de evaluación comparativa basado en el uso real, a través del registro de producción-env. Consultas, un poco como dije aquí:
Completar la transformación del esquema de la base de datos: ¿cómo probar las consultas reescritas?