sql >> Base de Datos >  >> RDS >> Database

Mejoras en el plan de presentación para UDF

Microsoft ha estado mejorando el contenido de la salida ShowplanXML para SQL Server en las últimas versiones y en SQL Server 2017 CU3, introdujeron estadísticas de ejecución de funciones definidas por el usuario (UDF) en el nodo QueryTimeStats de la salida XML. Esto también se volvió a trasladar a SQL Server 2016 en el Service Pack 2 para los planes de ejecución reales. Esta característica le permite conocer definitivamente el impacto de la ejecución de UDF escalar como parte de las características de rendimiento de una consulta. Sin embargo, hay una captura interesante asociada con el uso de esta función; debe recopilar el plan de ejecución real con una versión actualizada de SQL Server Management Studio o SentryOne Plan Explorer, o la información se eliminará del plan de ejecución.

Comparación de planes en diferentes versiones de SSMS

Recientemente presenté una sesión de un grupo de usuarios en Chicago sobre el ajuste del rendimiento de las consultas mediante la caché del plan y durante la sesión estaba usando la versión más reciente de SQL Server Management Studio en ese momento, la versión 17.5. En ese momento, también había actualizado recientemente mi VM a SQL Server 2016 Service Pack 2, por lo que demostré la nueva información de UdfElapsedTime y UdfCpuTime en el plan de presentación real QueryTimeStats y tomé nota para escribir un artículo sobre thm. Cuando volví para comenzar este artículo, usando exactamente la misma consulta en la misma máquina virtual, no pude generar un plan de ejecución real que contuviera la información de UdfElapsedTime o UdfCpuTime a pesar de los repetidos intentos. No pude entender qué estaba haciendo mal y resultó que la raíz del problema era que accidentalmente había iniciado SQL Server Management Studio 2016 en lugar de SQL Server Management Studio 17.5. Cuando ejecuté la misma consulta en SSMS 17.5, de repente obtuve la información de UdfElapsedTime y UdfCpuTime. Vea a continuación ejemplos del XML devuelto por ambas versiones de SSMS:

Showplan XML de SSMS 17,5

Showplan XML de SSMS 2016:WaitStats y QueryTimeStats se eliminaron por completo

Usé Microsoft Message Analyzer para producir un seguimiento TCP del tráfico de red en el puerto 1433 entre un cliente que ejecuta SSMS 2016 contra una instancia de SQL Server 2016 SP2 para capturar los paquetes TDS que se envían desde el servidor al cliente. Esto revela que ShowPlanXML devuelto por el servidor incluía la información de QueryTimeStats aunque no aparece en ShowPlanXML en SSMS 2016, por lo que el cliente en realidad está eliminando los campos no incluidos en la definición de esquema que se envió con el cliente.

Desplazamiento del mensaje:1635
<.Q.u.e.r.y.T.i.m.e.S.t.a.t.s. .E.l.a.p.s.e.d.T.i.m.e.=.".2.6.7.". .C.p.u.T.i.m.e.=.".2.6.7.". .U.d.f.E.l.a.p.s.e.d.T.i.d.T.i.e.=.".2.1.5.". .U.d.f.C.p.u.T.i.m.e.=.".2.1.5.".>.<./.Q.u.e.r.y.T.i.m.e.S.t.a.t.s.>

Esto es algo que se debe tener en cuenta con los archivos .sqlplan que se generan con versiones de clientes anteriores de SSMS y/o planes de ejecución que se guardan o copian de una versión anterior de SSMS, que es algo que sucede a menudo cuando trabajo con clientes. Email.

En SSMS, mirar el plan de ejecución gráfico no le da ninguna indicación del impacto en el rendimiento de la ejecución de la función escalar definida por el usuario en la consulta:

Si basamos nuestro análisis del rendimiento estrictamente en los costos de cada operador, el escalar de cálculo para la ejecución de la función no parece tener un impacto significativo en el rendimiento. La información sobre herramientas para los operadores tampoco materializa la información ni contiene advertencias sobre el impacto de la función definida por el usuario. El único lugar donde vemos esa información dentro de SSMS actualmente es en el XML del plan, o en la Ventana de propiedades para el operador raíz SELECCIONAR del plan, como se muestra a continuación:

Sin embargo, usando la información aquí, podemos ver que UdfCpuTime es el 85,79 % del total de CpuTime y UdfElapsedTime es el 64,44 % del total de ElapsedTime para la ejecución de la consulta (haciendo los cálculos para calcular los porcentajes usando QueryTimeStats CpuTime y UdfCpuTime (resaltados en azul arriba) y ElapsedTime y UdfElapsedTime).

Uso de SentryOne Plan Explorer para recuperar planes

Una de mis herramientas gratuitas favoritas para ayudar con el ajuste del rendimiento de SQL Server es SentryOne Plan Explorer, y una de las características de Plan Explorer durante mucho tiempo ha sido la capacidad de generar un plan de ejecución real pegando el texto del comando en una nueva ventana y haciendo clic en el botón Obtener plan real, como se muestra a continuación.

Dado que Plan Explorer lee ShowplanXML tal como lo proporciona el motor de SQL Server, también contendrá la información mejorada en QueryTimeStats. Sin embargo, si abre un plan de ejecución que se guardó desde una versión anterior de Management Studio, o si usa el complemento Plan Explorer para SSMS en una versión anterior para ver el plan en Plan Explorer, la información mejorada no se mostrará.

La cuadrícula Estado de la pestaña Resultados en el Explorador de planes se puede actualizar utilizando el Selector de columnas para agregar las columnas Duración de UDF y CPU de UDF junto con las columnas existentes en la cuadrícula, lo que facilita ver dónde está teniendo un impacto la ejecución de funciones definidas por el usuario. para grandes lotes de estados múltiples. Plan Explorer también proporciona resaltado de estas columnas cuando son una parte significativa de la CPU total y/o la duración, como se muestra a continuación.

También se ha mejorado la información del diagrama de planta en Plan Explorer. Estos son los diagramas que usan Costos por CPU + E/S y luego Costos por CPU:

Planificar diagrama usando Costos por CPU + E/S

Planificar diagrama usando Costos por CPU

Hay advertencias adicionales en el operador raíz SELECT cuando las estadísticas de ejecución de las funciones definidas por el usuario indican que son una parte significativa de la CPU total y/o la duración total:

Información sobre herramientas para la raíz Operador SELECCIONAR

El operador Compute Scalar también tiene una advertencia en Plan Explorer basada en el recuento de filas que procesa la operación, incluso para planes que no incluyen las mejoras para ShowplanXML:

Información sobre herramientas para Compute Operador escalar

Mostrar los costos por CPU puede ayudar a identificar a los operadores con costos de CPU ocultos que podrían quedar ahogados por la E/S. Esta capacidad de cambiar ligeramente la vista para solucionar problemas de CPU o E/S por sí solo es uno de los muchos diferenciadores entre Plan Explorer y SSMS. Aquí está el menú contextual del diagrama donde puede cambiar esta vista:

Conclusión

Las mejoras en Showplan XML en SQL Server hacen que sea mucho más fácil determinar el impacto general de las funciones escalares definidas por el usuario en el rendimiento de las consultas en SQL Server 2016 Service Pack 2 y SQL Server 2017 Cumulative Update 3, siempre y cuando utilice una versión más versión reciente de las herramientas del cliente o Plan Explorer para recuperar el plan de ejecución.