Tengo un SQL Server 2005 que se ha vuelto impredecible últimamente, y me estoy rascando la cabeza por qué. Las consultas que se ejecutan en segundos cambian los planes y toman minutos (tomar el tiempo en el análisis completo de la tabla o en el spool de índice). Ahora, lo primero y más obvio es que las estadísticas son obsoletas, lo que hace que el optimizador se confunda, pero estoy convencido de que este no es el caso, en primer lugar porque los datos subyacentes no cambian significativamente (por ejemplo, agregar los datos de un día sobre los datos de un año ya en una tabla) y en segundo lugar porque las estadísticas de creación automática y las estadísticas de actualización automática son verdaderas. Sin embargo, el optimizador se está confundiendo; ejecutar el SQL en el Asesor de ajuste me da muchas CREATE STATISTICS
declaraciones de varias columnas que parecen solucionarlo (hasta el siguiente bit de comportamiento incorrecto de SQL).
¿Alguna idea de una estrategia que pueda usar para abordar esta causa raíz? ¿Por qué las estadísticas "normales" no son suficientes?
where col=(cast @var...)
) y@var
podrían serlo'%'
. Lo heredé hace una o dos semanas y necesito mantenerlo funcionando básicamente hasta que se reemplace. Gracias por el enlace, le daré un giro.SOS_SCHEDULER_YIELD
fueCXPACKET
ysp_configure "max degree of parallelism", 1
parece haber, por ahora, golpeado ambos problemas en la cabeza. ¡Gracias!De MSDN :
"Las operaciones de inserción se producen en columnas clave ascendentes o descendentes Las estadísticas en columnas clave ascendentes o descendentes, como IDENTIDAD o columnas de marca de tiempo en tiempo real, pueden requerir actualizaciones estadísticas más frecuentes que las que realiza el optimizador de consultas. Las operaciones de inserción agregan nuevos valores a las columnas ascendentes o descendentes . El número de filas agregadas puede ser demasiado pequeño para activar una actualización de estadísticas. Si las estadísticas no están actualizadas y las consultas se seleccionan de las filas agregadas más recientemente, las estadísticas actuales no tendrán estimaciones de cardinalidad para estos nuevos valores. dar como resultado estimaciones de cardinalidad inexactas y un rendimiento de consulta lento.
Por ejemplo, una consulta que selecciona las fechas de pedidos de ventas más recientes tendrá estimaciones de cardinalidad inexactas si las estadísticas no se actualizan para incluir estimaciones de cardinalidad para las fechas de pedidos de ventas más recientes.
Después de las operaciones de mantenimiento Considere actualizar las estadísticas después de realizar procedimientos de mantenimiento que cambien la distribución de datos, como truncar una tabla o realizar una inserción masiva de un gran porcentaje de las filas. Esto puede evitar retrasos futuros en el procesamiento de consultas mientras las consultas esperan actualizaciones de estadísticas automáticas ".
Puede usar "EXEC sp_updatestats" de vez en cuando en su sistema (programado en algún momento) o usar la función STATS_DATE en todos los objetos y ver cuándo se actualizaron sus estadísticas la última vez y si hubo demasiado tiempo desde entonces, use UPDATE ESTADÍSTICAS para ese objeto en particular. En mi experiencia, incluso con las estadísticas automáticas habilitadas, todavía estamos obligados a actualizar las estadísticas de vez en cuando, debido a las operaciones de inserción que no activaron la actualización automática.
Para agregar mi código personal (usado en un trabajo semanal que construye declaraciones dinámicas para la actualización de estadísticas):
Aquí obtengo todos los objetos en los que no se actualizaron las estadísticas durante más de 3 meses o desde la última actualización de estadísticas, se modificó más del 10% de las filas.
fuente
SOS_SCHEDULER_YIELD
pero no puedo decir en este momento si eso se debe a los malos planes, o si esta caja (de 6 años, 2 procesadores, 4G RAM) realmente está sobrecargada ahora y he pasado un punto de inflexión.Supongo que una o más de sus tablas se están volviendo lo suficientemente grandes como para no alcanzar el 20% de los cambios necesarios para ayudar a marcar esas estadísticas actuales como obsoletas para que las Estadísticas de actualización automática entren en acción y, sin embargo, haya suficientes actualizaciones (o inserciones ) que tener estadísticas actualizadas ayudaría mucho. Encontré lo mismo recientemente en un entorno particular después de actualizar de SQL 2000 a SQL 2008.
Además de los otros sitios mencionados en las respuestas anteriores, sugeriría consultar los siguientes recursos en línea.
1) Red-Gate tiene una serie de libros electrónicos gratuitos disponibles para descargar, incluidos "SQL Server Statistics" de Holger Schmeling, donde encontrará la siguiente cita:
http://www.red-gate.com/our-company/about/book-store/
"las tablas con más de 500 filas al menos el 20% de los datos de una columna tuvieron que cambiarse para invalidar cualquier estadística vinculada"
2) SQL Sentry tiene una herramienta gratuita Plan Explorer que ayuda a rastrear problemas dentro de un plan SQL, como una estimación de demasiadas o muy pocas filas en comparación con el número real de filas para una tabla dada en una consulta. Simplemente guarde el plan de ejecución real de SSMS y luego recorra las diferentes partes del plan utilizando Plan Explorer. No es que la información no esté disponible en SSMS usando el plan de ejecución gráfico, pero la herramienta de SQL Sentry hace que sea mucho más fácil de ver.
http://www.sqlsentry.com/plan-explorer/sql-server-query-view.asp
3) Consulte la fecha de actualización de estadísticas usted mismo para ver las tablas en las consultas que más le interesen usando STATS_DATE (), puede encontrar una consulta rápida para obtener las estadísticas más antiguas utilizando una consulta que se encuentra en la siguiente discusión.
http://blog.sqlauthority.com/2010/01/25/sql-server-find-statistics-update-date-update-statistics/
¡Espero que esto ayude!
¡Creo que disfrutarás especialmente el libro de Red-Gate!
-Jeff
fuente