Las pruebas de rendimiento en la vista de SQL Server arrojaron resultados sorprendentes. ¿Por qué?

Recientemente, realizamos algunos cambios en algunas vistas de SQL Server que tenían el potencial de afectar negativamente el rendimiento. Decidimos ejecutar algunas pruebas de rendimiento en estas vistas para ver cómo las habíamos afectado. Los resultados fueron sorprendentes.

El siguiente gráfico muestra los resultados de las pruebas de rendimiento que realizamos. Esto es lo que representa el gráfico:

  • La línea azul es la vista antes de realizar cualquier cambio.
  • La línea roja muestra la vista después de realizar los cambios.
  • El eje x representa iteraciones en un bucle.
    • Cada iteración, mil nuevos récords se insertan (que la vista devolverá).
    • En cada iteración, hacemos varias selecciones desde la vista que estamos probando y promediamos los resultados.
  • El eje Y representa el tiempo que tarda la vista en devolver los resultados.
  • La declaración de selección que se probó el rendimiento tenía una cláusula where para devolver solo 100 registros cada vez. (Hubo 100 registros insertados en cada nombre durante la prueba).

Los resultados nos muestran que definitivamente recibimos un impacto en el rendimiento, pero lo que nos desconcierta es ese enorme aumento en el rendimiento una vez que alcanzamos alrededor de 40,000 registros en la base de datos. Hemos realizado esta prueba en varios servidores diferentes y obtener resultados similares cada vez.

Me pregunto si alguien puede dar una idea de por qué sucede esto. ¿Por qué obtenemos un gran ganancia de rendimiento cuando rompamos el nivel récord de 40,000? ¿Alguien habia visto algo como esto antes? He intentado buscar alguna razón para esto, pero me he quedado con las manos vacías.

Hemos intentado ajustar la vista, jugar con los índices, reconstruir y reorganizar los índices, analizar el plan de ejecución y varias otras cosas, pero hasta ahora no hemos encontrado nada que pudiera causar esto.

Ver rendimiento

Cualquier ayuda o idea sería muy apreciada. Gracias.

preguntado el 03 de mayo de 12 a las 21:05

¿Y la estructura aproximada de la tabla, los índices y la consulta de vista son? La mejor suposición sin información, está escaneando una tabla de índice cuando no debería y el DB finalmente resuelve esto y hace un escaneo completo. -

La vista es bastante compleja, y lo mismo ocurre con los índices y la estructura de la tabla. Solo estoy buscando ideas sobre dónde buscar para diagnosticar este problema. Examinaré más los escaneos de índice frente a los escaneos de tablas que mencionaste. Gracias. -

Publique una captura de pantalla del antes y el después de los planes de ejecución reales. Ejecute la consulta en un "tamaño de entrada" donde se sorprenda con la diferencia de rendimiento. Es probable que el problema sea la desestimación de la cardinalidad. -

Publicar el plan de ejecución sería mucho más útil. -

Debido al gran tamaño del plan de consulta, no es práctico publicar aquí. Sin embargo, varias de sus respuestas me han ayudado a orientarme en la dirección correcta. Como señaló @usr, creo que tiene algo que ver con la desestimación de la cardinalidad. -

2 Respuestas

Debe abordar esto como cualquier otra investigación de desempeño: use una metodología y una medición sólidas. Esperas y colas será, nuevamente, invaluable como metodología para identificar los cuellos de botella. Una vez que identifique y mida las métricas relevantes, la respuesta puede ser lo que está sucediendo.

En este momento, simplemente midió el tiempo de respuesta, sin ningún dato real de cómo se gastó el tiempo. Sin presentar un único punto de datos real (métricas recopiladas, especificaciones de prueba para que otros las intenten, etc.), cualquier La explicación podría aventurarse con las mismas posibilidades de acertar: código de cliente, contención de bloqueo, crecimiento de archivos, crecimiento de registros, estadísticas de índice, cambios en el plan de consulta, error humano, gremlins, rayos de luna y, por supuesto, mi favorito: fragmentación.

Entonces, realice el análisis y la investigación adecuados y recopile las métricas relevantes, o publique la prueba exacta (guiones de reproducción, metodología) para que podamos medirnos a nosotros mismos.

contestado el 03 de mayo de 12 a las 21:05

¿Ha intentado actualizar las estadísticas en las tablas involucradas?

Quizás sus estadísticas estaban desactualizadas y el plan que se utilizó era el plan incorrecto para su número de filas.

contestado el 04 de mayo de 12 a las 01:05

+1 Creo que SQL Server podría actualizar automáticamente las estadísticas después de que se modifique el X% de las filas, por lo que cada 1000 filas no necesariamente actualizará las estadísticas y pueden quedar desactualizadas. También una puñalada aleatoria: 40K registros es donde el costo paralelo es menor que la penalización de rendimiento estimada de paralelizar la consulta. - ta.speot.es

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.