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

ACTUALIZACIONES de Estadísticas

Las últimas versiones de SQL Server han introducido una gran cantidad de características nuevas, así como mejoras en la funcionalidad existente. Un área del motor que es fácil pasar por alto son las estadísticas. Después de todo, las estadísticas aún se crean de la misma manera, aún le informan sobre la distribución de datos, el Optimizador de consultas todavía las usa ... ¿qué es diferente? La función básica de las estadísticas sigue siendo la misma, pero la forma en que el Optimizador de consultas las usa cambia según el Estimador de cardinalidad que esté usando. También hay varios cambios dignos de mención relacionados con la actualización de estadísticas y se ha agregado una nueva funcionalidad para ver información de estadísticas. En conjunto, estos cambios en las últimas versiones pueden causar una variación en el comportamiento de SQL Server que no esperaba.

Nota:Esta publicación es más aplicable a SQL Server 2012 y versiones posteriores, pero se incluyen algunos detalles de versiones anteriores como referencia (y diversión).

Servidor SQL 7.0

  • La cantidad de pasos en un histograma está limitada a 300. En SQL Server 6.5 y versiones anteriores, un histograma tendría la cantidad de pasos que caben en una página de 2K, según el tamaño de la primera columna de la clave.
  • Se introduce la opción de la base de datos 'actualizar automáticamente las estadísticas'; anteriormente, las estadísticas solo se actualizaban manualmente.

Servidor SQL 2000

  • El número de pasos en el histograma se reduce de 300 a 200 (técnicamente 201, si incluye el paso para NULL, suponiendo que la primera columna de la clave permita NULL).

Servidor SQL 2005

  • Las actualizaciones de las estadísticas que usan FULLSCAN pueden ejecutarse en paralelo.
  • Los indicadores de seguimiento 2389 y 2390 se introdujeron en SP1 para ayudar con el problema de la clave ascendente, descrito en la publicación Claves ascendentes y estadísticas de corrección rápida automática. Se proporciona un ejemplo detallado de este escenario en mi publicación Trace Flag 2389 y el nuevo Cardinality Estimator.
  • Se introduce la opción de instancia "Actualizar automáticamente las estadísticas de forma asíncrona". Tenga en cuenta que para que esto tenga efecto, la opción 'Actualizar estadísticas automáticamente' también debe estar habilitada. Si no tiene claro lo que hace esta opción, revise la documentación en Opciones de ALTER DATABASE SET. Esta es una configuración que recomienda Glenn (como se indica en su publicación a la que se hace referencia a continuación), pero creo que es importante tener en cuenta los posibles problemas, como se indica en Cómo las actualizaciones automáticas de las estadísticas pueden afectar el rendimiento de las consultas.

    Nota: Hay una pérdida de memoria relacionada con esta configuración en SQL Server 2008 a SQL Server 2012; consulte la publicación de Glenn Revisión importante para SQL Server 2008 para obtener más detalles.

Servidor SQL 2008

  • Se introducen estadísticas filtradas y se pueden crear por separado a partir de un índice filtrado. Existen algunas limitaciones en torno a los índices filtrados con respecto a la publicación del Optimizador de consultas (consulte la publicación de Tim Chapman The Pains of Filtered Indexes y la publicación de Paul White Limitaciones del optimizador con índices filtrados), y es importante comprender el comportamiento del contador que rastrea las modificaciones (y por lo tanto, puede desencadenar actualizaciones automáticas). Consulte la publicación de Kimberly Los índices filtrados y las estadísticas filtradas pueden volverse muy obsoletos para obtener más detalles, y también recomiendo consultar su procedimiento almacenado que analiza el sesgo de datos y recomienda dónde puede crear estadísticas filtradas para proporcionar más información al Optimizador de consultas. Implementé esto para varios clientes grandes que tienen VLT y distribución sesgada en las columnas que se usan con frecuencia en los predicados.
  • Se agregaron dos nuevas vistas de catálogo, sys.stats y sys.stats_columns, para brindar una visión más sencilla de las estadísticas y las columnas incluidas. Utilice estas dos vistas en lugar de sp_helpstats, que está en desuso y proporciona menos información.

Servidor SQL 2008R2 SP1

  • Se pone a disposición Trace Flag 2371, que se puede utilizar para reducir la cantidad de modificaciones necesarias para que se produzcan las actualizaciones automáticas de las estadísticas. Como recordatorio, soy fanático de actualizar las estadísticas regularmente a través de un trabajo programado y dejar la actualización automática habilitada como medida de seguridad.

Servidor SQL 2008R2 SP2

  • Se incluye la función sys.dm_db_stats_properties, que proporciona la misma información que se encuentra en el encabezado de DBCC SHOW_STATISTICS, así como una columna de modificación que podría usarse para realizar un seguimiento de los cambios y determinar mediante programación si se necesitaba una actualización. ¿Recuerdas mi preferencia por usar un trabajo para actualizar las estadísticas? Ese trabajo se volvió mucho más inteligente con este DMF... ahora puedo ver cuántos datos se han modificado y SÓLO actualizar las estadísticas si un cierto porcentaje de datos ha cambiado. Resbaladizo.

Servidor SQL 2012

  • La actualización de las estadísticas no invalidará los planes SI no ha cambiado ninguna fila. Este es uno que sorprende a mucha gente, y Kimberly tiene una publicación divertida, ¿Qué causó que ese plan saliera terriblemente mal? ¿Deberías actualizar las estadísticas?, que explica su aventura para resolver esto.

Servidor SQL 2012 SP1

  • DBCC SHOW_STATISTICS solo requiere el permiso SELECT; anteriormente requería que un usuario fuera miembro de sysadmin, o miembro de la función de base de datos db_owner o db_ddladmin. Esto se puede deshabilitar globalmente con el indicador de rastreo 9485.
  • Incluye sys.dm_db_stats_properties (consulte la nota anterior de 2008R2 SP2)

Servidor SQL 2012 SP2

  • La actualización acumulativa 1 presenta una corrección relacionada con las teclas ascendentes que no se identifican correctamente incluso con las marcas de seguimiento 2389 y 2390 en uso. Esto requiere el indicador de seguimiento 4139 además de CU1, como se indica en KB 2952101.

Servidor SQL 2014

  • Se presenta el nuevo Estimador de cardinalidad, que se implementa configurando el modo de compatibilidad de la base de datos en 120 o usando el indicador de rastreo 2312. Si no ha leído nada sobre el nuevo CE, le recomiendo comenzar con la documentación de Estimación de cardinalidad y luego leer a Joe El documento técnico de Sack, Optimización de sus planes de consulta con SQL Server 2014 Cardinality Estimator, para obtener detalles detallados.
  • El comportamiento de Trace Flags 2389 y 2390 para claves ascendentes ahora se implementa a través del modo de compatibilidad de base de datos. Si el modo de compatibilidad de su base de datos está configurado en 120 (o superior en versiones posteriores), no necesita usar Trace Flags 2389 y 2390 para SQL Server para identificar estadísticas que tienen claves ascendentes.
  • Se introducen estadísticas incrementales para las particiones y se pueden ver a través del nuevo DMF sys.dm_db_incremental_stats_properties. Las estadísticas incrementales proporcionan una forma de actualizar las estadísticas de una partición sin actualizarlas para toda la tabla. Sin embargo, el Optimizador de consultas no utiliza la información estadística adicional de las estadísticas incrementales, sino que se incluye en el histograma principal de la tabla.
  • CU2 incluye la misma solución mencionada anteriormente para SQL Server 2012 SP2 que también requiere el indicador de seguimiento 4139.

Servidor SQL 2014 SP1

  • La marca de seguimiento 7471 está adaptada a CU6, disponible originalmente en SQL Server 2016, como se indica a continuación.

Servidor SQL 2016

  • El indicador de seguimiento 2371 ya no es necesario para reducir el umbral de actualizaciones automáticas de las estadísticas si el modo de compatibilidad de la base de datos se establece en 130. Consulte Control del comportamiento de Autostat (AUTO_UPDATE_STATISTICS) en SQL Server.
  • Las actualizaciones de las estadísticas pueden ejecutarse en paralelo cuando se usa SAMPLE, no solo FULLSCAN. Esto está relacionado con el modo de compatibilidad (debe ser 130), pero potencialmente puede proporcionar actualizaciones más rápidas y, por lo tanto, disminuir las ventanas de mantenimiento. Aaron Bertrand habla sobre esta mejora en su publicación, Una mejora potencial para las actualizaciones de estadísticas:MAXDOP.
  • El indicador de seguimiento 7471 se introdujo en CU1 para permitir que varios comandos de ACTUALIZAR ESTADÍSTICAS se ejecuten simultáneamente para una sola tabla y Jonathan proporciona algunos excelentes ejemplos de cómo se puede usar esto en su publicación Soporte mejorado para reconstrucciones de estadísticas paralelas.

Servidor SQL 2016 SP1

  • Se presenta la opción de sugerencia de consulta ENABLE_HIST_AMENDMENT_FOR_ASC_KEYS, junto con el argumento FOR HINT, que es el equivalente al indicador de rastreo 4139.
  • El histograma sys.dm_db_stats_histogram de DMF se expone en CU2, que es una alternativa a la salida del histograma de DBCC SHOW_STATISTICS. La información en ambos es la misma, usa la que te resulte más fácil o se ajuste mejor al problema que necesitas resolver.
  • La opción PERSIST_SAMPLE_PERCENT se introdujo en CU4, que se puede usar para forzar el uso de la misma frecuencia de muestreo cada vez que se actualice una estadística en el futuro, y se pueden encontrar ejemplos de este comportamiento en la publicación, Tasa de muestreo de estadísticas persistentes.

Servidor SQL 2017

  • La opción PERSIST_SAMPLE_PERCENT está disponible en CU1 (consulte la entrada SP1 de 2016 para obtener información adicional).
  • Los atributos StatsInfoType y OptimizerStatsUsageType se agregan al Plan de consultas, que enumera las estadísticas utilizadas durante la optimización de consultas. Está disponible en CU3 y está vinculado a la versión CE (120 y superior). ¡Esto está muy bien! Todavía no he tenido la oportunidad de jugar con esto, pero para obtener esta información anteriormente, tenía que usar marcas de rastreo no documentadas.
  • CU3 también introdujo la opción MAXDOP para CREAR ESTADÍSTICAS y ACTUALIZAR ESTADÍSTICAS, que se puede usar para anular el valor MAXDOP para la instancia o la base de datos.
  • Una adición más en CU3:los atributos UdfCpuTime y UdfElapsedTime se pueden encontrar en el Plan de consulta, que representan estadísticas de ejecución para UDF con valores escalares.

Resumen

Si está buscando actualizar a una versión más reciente, o si ha actualizado recientemente, tome nota de cómo estos cambios afectan su solución. Muchos clientes se han puesto en contacto con nosotros después de actualizar de 2005/2008/2008R2 a 2014 o 2016, quejándose de problemas de rendimiento. En muchos casos, no se completaron las pruebas adecuadas antes de la actualización.

Esto es algo en lo que realmente nos enfocamos cuando ayudamos a un cliente a actualizarse. Más allá de los pasos para mover una instancia de producción de una versión a otra con poco tiempo de inactividad, queremos asegurarnos de que el día posterior a la actualización sea aburrido para los administradores de bases de datos y los desarrolladores.

No solo probamos el proceso de actualización, probamos cómo se ve el sistema después de la actualización. ¿Se necesitan las mismas marcas de seguimiento del antiguo entorno en el nuevo? ¿Qué configuraciones de la base de datos deben ajustarse? ¿Cambia el rendimiento de las consultas, para bien o para mal? Si no sabe las respuestas a esas preguntas antes de actualizar la producción, entonces se está preparando para uno o muchos días de lucha contra incendios, llamadas de Sev 1, comidas en su escritorio, no dormir lo suficiente y quién sabe qué más. .

Tómese el tiempo necesario para comprender el impacto de las nuevas funciones y los cambios en la funcionalidad enumerados anteriormente, planifique la actualización y pruebe tanto como sea posible.