2008-09-14 9 views
10

Sé que esta es una pregunta amplia, pero he heredado varios malos resultados 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?¿Qué pasos deberían ser necesarios para optimizar una consulta de bajo rendimiento?

pregunta relacionada:
What generic techniques can be applied to optimize SQL queries?

+0

es muy similar a [esta pregunta mayor] (http://stackoverflow.com/questions/39331/what-generic-techniques-can-be-applied-to-optimize-sql-queries#39344) – Unsliced

Respuesta

14
  1. Mira el plan de ejecución en el analizador de consultas
  2. Ver qué paso cuesta más
  3. optimizar la etapa!
  4. Volver al paso 1 [THX a Vinko]
+0

4 debe leer 'Ir al paso 1' –

+1

Este es un bucle y el bucle es malo en sql. :) Yo bromeo ... Yo bromeo ... Amo esta respuesta. –

+0

Si necesita más detalles, también puede examinar la salida de rastreo (use 'SET AUTOTRACE ON' en Oracle). Esto te permitirá ver cosas como lecturas físicas, etc. Sin embargo, solo lo usaría después de seguir los consejos de Roman. –

3

índices pueden ser un buen punto de partida ...

La fruta madura puede ser derribado con el SQL Índice ajuste del Servidor Asistente.

+0

Estoy de acuerdo en que este puede ser un buen lugar para comenzar, pero después de un tiempo descubrí que tiene un poco de conflicto consigo mismo. Quiere eliminar los índices que ha creado para un intento de ajuste previo. –

2

mirada a los índices en las tablas que componen 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.

De no ser así (porque hay aspectos negativos en el uso de sugerencias de bloqueo) mira bloqueo consejos y nombrar explícitamente el índice a utilizar en la unión. Usar NOLOCKS es más obvio si está recibiendo muchas transacciones en punto muerto.

Haz lo que Roman y Andy S mencionaron primero.

7

En SQL Server, puede consultar 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 le faltan completamente los índices
  • Escaneos de índice; su consulta no puede ser el uso de los índices correctos
  • El grosor de las flechas entre cada paso de una consulta que indica cuántas filas están siendo producidos por ese paso, flechas muy gruesas significa que está procesando una gran cantidad de filas, y puede indicar que algunas uniones deben ser optimizadas.

Algunos otros consejos generales:

  • Una gran cantidad de sentencias condicionales, tales como múltiples si-else, puede hacer que SQL Server para reconstruir constantemente el plan de consulta. Puede verificar esto usando Profiler.
  • Asegúrese de que las diferentes consultas no bloqueen entre sí, tales como una instrucción de actualización bloquear una instrucció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.

1

El plan de ejecución es un gran comienzo y lo ayudará a descubrir qué parte de su consulta debe abordar.

Una vez que descubra dónde, es hora de abordar el cómo y por qué. 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 pistas 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.

2

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 tengas un monitor de 400 ") muestra qué pasos de tu consulta están absorbiendo el tiempo.

Si tienes un paso que lleva un paso 80% loco, entonces tal vez se podría agregar un índice, luego de ajustar el índice, vuelva a ejecutar el plan de ejecución para encontrar el siguiente paso más grande.

Después de un par de ajustes puede encontrar que realmente no hay pasos que se mantengan de los demás, es decir, todos son de 1-2% cada uno. Si ese es el caso, entonces es posible que deba ver si hay alguna manera de reducir la cantidad de datos incluidos en su consulta, haga esos cuatro millones las órdenes de venta cerradas deben incluirse en la consulta "Órdenes de venta activas" No, así que excluya todas aquellas con ESTADO = 'C' ... o algo así .

Otra mejora que verá en el Plan de ejecución son las búsquedas en los 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 el escaneo de la tabla, en primer lugar, si es así, ¿realmente necesita ese índice?

Con los índices, y especialmente con SQL Server 2005 debe mirar a la cláusula INCLUDE, esto básicamente le permite tener una columna en un índice sin estar realmente en el índice, por lo que si todos los datos que necesita para su consulta es en su índice o es una columna incluida, entonces SQL Server ni siquiera tiene que mirar la tabla, una gran recuperación de rendimiento.

2

Hay un par de cosas que puede observar para optimizar el rendimiento de su consulta.

  1. 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.

  2. Considere de-la normalización de su base de datos para reducir une

  3. evitar bucles (es decir, ir a buscar los cursores), se adhieren a las operaciones de conjuntos.

  4. Implemente la consulta como un procedimiento almacenado, ya que está precompilado y se ejecutará más rápido.

  5. Asegúrese de tener los índices correctos configurados. Si su base de datos se usa principalmente para buscar, entonces considere más índices.

  6. Utilice 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.

  7. 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. Basics of Statistics in SQL Server 2005

  8. Asegúrese de que sus índices no están fragmentados Reducing SQL Server Index Fragmentation

  9. Asegúrese de que sus tablas no están fragmentados. How to Detect Table Fragmentation in SQL Server 2000 and 2005

+0

Por supuesto, vuelva a pensar toda la arquitectura de su base de datos para sintonizar una sola consulta. La des-normalización no es un paso de ajuste de consulta. Las exploraciones de tabla no son costosas cuando la otra opción es realizar un escaneo de índice seguido del acceso a la tabla por rowid cuando necesita el 100% de las filas en primer lugar. –

+0

Tal vez el problema es la arquitectura de la base de datos. –

Cuestiones relacionadas