sql-server - rapidas - plan de ejecución y optimización de consultas sql server 2008 r2
¿Qué pasos deberían ser necesarios para optimizar una consulta de bajo rendimiento? (7)
Sé que esta es una pregunta amplia, pero he heredado varios actores de bajo rendimiento y necesito optimizarlos de manera deficiente. Me preguntaba cuáles son los pasos más comunes involucrados para optimizar. Entonces, ¿qué pasos toman algunos de ustedes cuando enfrentan la misma situación?
Pregunta relacionada:
¿Qué técnicas genéricas se pueden aplicar para optimizar las consultas SQL?
Hay un par de cosas que puede ver para optimizar el rendimiento de su consulta.
Asegúrese de tener el mínimo de datos. Asegúrese de seleccionar solo las columnas que necesita. Reduzca los tamaños de campo a un mínimo.
Considere la desnormalización de su base de datos para reducir las uniones
Evite los bucles (es decir, busca cursores), se adhieren a las operaciones de ajuste.
Implemente la consulta como un procedimiento almacenado ya que está precompilado y se ejecutará más rápido.
Asegúrese de tener configurados los índices correctos. Si su base de datos se usa principalmente para buscar, entonces considere más índices.
Use el plan de ejecución para ver cómo se realiza el procesamiento. Lo que desea evitar es un escaneo de tabla ya que es costoso.
Asegúrese de que la Estadística automática esté activada. SQL necesita esto para ayudar a decidir la ejecución óptima. Vea la gran publicación de Mike Gunderloy para más información. Conceptos básicos de las estadísticas en SQL Server 2005
Asegúrese de que sus índices no estén fragmentados. Reducción de la fragmentación del índice de SQL Server
Asegúrate de que tus tablas no estén fragmentadas. Cómo detectar fragmentación de tabla en SQL Server 2000 y 2005
El plan de ejecución es un gran comienzo y lo ayudará a descubrir qué parte de su consulta debe abordar.
Una vez que descubras dónde, es hora de abordar el cómo y el porqué. Eche un vistazo al tipo de consultas que está tratando de realizar. Evite los bucles a toda costa, ya que son lentos. Evite los cursores a toda costa porque son lentos. Quédese para establecer consultas basadas siempre que sea posible.
Hay formas de dar sugerencias sql sobre el tipo de uniones para usar si está utilizando uniones. Tenga cuidado aquí, aunque una sugerencia puede acelerar su consulta una vez, puede ralentizar su consulta 10 veces la próxima vez dependiendo de los datos y parámetros.
Finalmente, asegúrese de que su base de datos esté bien indexada. Un buen lugar para comenzar es cualquier campo que esté contenido en una cláusula WHERE que probablemente deba tener un índice.
En SQL Server puede ver el Plan de consulta en el Analizador de consultas o en Management Studio. Esto le indicará el porcentaje aproximado de tiempo pasado en cada lote de declaraciones. Deberá buscar lo siguiente:
- Escaneos de tabla; esto significa que te faltan completamente los índices
- Escaneos de índice; su consulta puede no estar usando los índices correctos
- El grosor de las flechas entre cada paso en una consulta le indica cuántas filas se producen con ese paso, las flechas muy gruesas significa que está procesando muchas filas y puede indicar que algunas uniones deben optimizarse.
Algunos otros consejos generales:
- Una gran cantidad de sentencias condicionales, como múltiples instrucciones if-else, pueden hacer que SQL Server reconstruya constantemente el plan de consulta. Puede verificar esto usando Profiler.
- Asegúrese de que las consultas diferentes no se bloqueen entre sí, como una instrucción de actualización que bloquea una declaración de selección. Esto se puede evitar especificando la sugerencia (nolock) en las sentencias de selección de SQL Server.
- Como han mencionado otros, pruebe el asistente de ajuste del rendimiento en Management Studio.
Finalmente, recomiendo crear un conjunto de pruebas de carga (usando Visual Studio 2008 Test Edition), que puede usar para simular el comportamiento de su aplicación cuando se trata de una gran cantidad de solicitudes. Algunos cuellos de botella de rendimiento de SQL solo se manifiestan bajo estas circunstancias, y poder reproducirlos hace que sea mucho más fácil solucionarlo.
Mire los índices en las tablas que hacen la consulta. Se pueden necesitar índices en campos particulares que participan en la cláusula where. También mire los campos usados en las uniones en la consulta (si existen uniones). Si los índices ya existen, mira el tipo de índice.
En su defecto (porque hay aspectos negativos al uso de consejos de bloqueo) Observe los consejos de bloqueo y el nombre explícito del índice para usar en la unión. Usar NOLOCKS es más obvio si está recibiendo muchas transacciones en punto muerto.
Sin embargo, lo que Roman y Andy S mencionaron primero.
No estoy seguro acerca de otras bases de datos, pero para SQL Server recomiendo el plan de ejecución. Es muy claro (aunque con un montón de desplazamiento vertical y horizontal, a menos que tenga un monitor de 400 ") muestra qué pasos de su consulta están absorbiendo el tiempo.
Si tiene un paso que lleva un loco 80%, entonces tal vez se pueda agregar un índice, luego, después de ajustar el índice, vuelva a ejecutar el Plan de ejecución para encontrar su próximo paso más importante.
Después de un par de ajustes, puede descubrir que realmente no hay pasos que se destaquen de los demás, es decir, todos son 1-2% cada uno. Si ese es el caso, entonces podría necesitar ver si hay una forma de reducir la cantidad de datos incluidos en su consulta, esos cuatro millones de órdenes de venta cerradas deben incluirse en la consulta de "Pedidos de ventas activos". ? No, así que excluye a todos aquellos con STATUS = ''C'' ... o algo así.
Otra mejora que verá en el Plan de ejecución son las búsquedas de marcadores, básicamente encuentra una coincidencia en el índice, pero luego SQL Server debe rastrear rápidamente la tabla para encontrar el registro que desea. En realidad, esta operación podría llevar más tiempo que solo escanear la tabla, en primer lugar, si es así, ¿realmente necesita ese índice?
Con los índices, y especialmente con SQL Server 2005, debe consultar la cláusula INCLUDE, esto básicamente le permite tener una columna en un índice sin estar realmente en el índice, de modo que si todos los datos que necesita para su consulta están en su índice o es una columna incluida, entonces SQL Server ni siquiera tiene que mirar la tabla, una gran recuperación de rendimiento.
- Mire el plan de ejecución en el analizador de consultas
- Vea qué paso cuesta más
- Optimizar el paso!
- Regrese al paso 1 [thx a Vinko ]
Los índices pueden ser un buen lugar para comenzar ...
La fruta que cuelga poco se puede derribar con el Asistente de ajuste del índice de SQL Server .