Bajo rendimiento de la consulta

10

Tenemos un procedimiento grande (más de 10,000 líneas) que generalmente se ejecuta en 0.5-6.0 segundos dependiendo de la cantidad de datos con los que tiene que trabajar. Durante el último mes, más o menos, ha comenzado a tomar más de 30 segundos después de realizar una actualización de estadísticas con FULLSCAN. Cuando se ralentiza, un sp_recompile "soluciona" el problema, hasta que el trabajo de estadísticas nocturnas se ejecuta nuevamente.

Al comparar los planes de ejecución lenta y rápida, lo he reducido a una tabla / índice específico. Cuando se ejecuta lentamente, se estima que se devolverán ~ 300 filas de un índice específico, cuando se ejecuta rápidamente se estima 1 fila. Cuando se ejecuta lentamente, usa un Table Spool después de hacer una búsqueda en el índice, cuando se ejecuta rápido no hace el Table Spool.

Usando DBSS SHOW_STATISTICS, graficé el histograma de índice en Excel. Normalmente esperaría que el gráfico sea más "colinas onduladas", pero en cambio, parece una montaña, el punto más alto es 2x-3x más alto que la mayoría de los otros valores en el gráfico.

Histograma de índice

Si actualizo las estadísticas, sin FULLSCAN, parece más normal. Si luego lo ejecuto con FULLSCAN nuevamente, parece que lo describí anteriormente.

Esto se siente como un problema de análisis de parámetros, y específicamente relacionado con la distribución de índices (aparentemente) extraña anterior.

El proceso toma un parámetro con valores de tabla, ¿puede suceder el rastreo de parámetros en un parámetro con valores de tabla?

EDITAR: El proceso también toma otros 12 parámetros, algunos de los cuales son opcionales, dos de los cuales son una fecha de inicio y finalización.

¿El histograma es extraño o estoy ladrando al árbol equivocado?

Ciertamente me siento cómodo tratando de ajustar la consulta y / o tratar de ajustar mi indexación. Si esa es la solución que es genial, en ese momento mi pregunta es más sobre el histograma sesgado.

Debo mencionar que este es un índice agrupado de IDENTIDAD PK. Tenemos dos sistemas que se comunican entre sí, uno es un sistema heredado y otro un nuevo sistema interno. Ambos sistemas almacenan datos similares. Para mantenerlos sincronizados, el PK en esta tabla en el nuevo sistema se incrementa cuando se agregan elementos al sistema anterior, incluso si los datos no se transfieren (se realiza una RESEED). Por lo tanto, podría haber algunas lagunas en la numeración en esta columna. Los registros rara vez, si es que se eliminan

Cualquier pensamiento sería muy apreciado. Estoy más que feliz de reunir / incluir más información.

Mark Wilkinson
fuente
¿Es el único parámetro para el procedimiento un TVP o hay otros parámetros también?
Martin Smith
1
Si nos fijamos en un plan XML lento y rápido, ¿la diferencia podría explicarse por diferentes ParameterCompiledValuepara estos otros parámetros?
Martin Smith
1
El rango de fechas con el que se compiló es dramáticamente más estrecho (5 días en lugar de 31). Para la mayoría de las llamadas, este proceso se ejecutará durante un mes. Podría intentar agregar una sugerencia de recompilación a esa declaración específica.
Mark Wilkinson el
1
Eso definitivamente parece una distribución extraña para una columna de identidad. Estaba leyendo este artículo y me preguntaba si puede dar más detalles sobre lo que está viendo para estimar versus real en estos dos planes. > blogs.technet.com/b/mspfe/archive/2013/04/18/…
Richard Schweiger
1
Para ser claros: ¿cuál es exactamente el gráfico? RANGE_HI_KEYpresumiblemente en el eje x, pero ¿qué hay en el eje y? EQ_ROWS? RANGE_ROWS? ¿La suma de esos?
Paul White 9

Respuestas:

3

Esto terminó estando relacionado con la detección de parámetros. Dio la casualidad de que algunas versiones extrañas de esta consulta se estaban ejecutando MISMO DESPUÉS de que se reconstruyeron las estadísticas. Por lo tanto, el plan en caché no era representativo de la mayoría de las llamadas. Utilicé el truco de copiar los parámetros de fecha en variables locales y esto funciona bien, con poco o ningún impacto en el rendimiento. Esto no responde por qué el histograma se ve tan "apagado", pero explica mis problemas de rendimiento.

Mark Wilkinson
fuente