Estoy tratando de comprender mejor (conceptualmente) la relación entre estadísticas, planes de ejecución, ejecución de procedimientos almacenados.
¿Estoy en lo cierto al decir que las estadísticas solo se usan cuando se crea el plan de ejecución para un procedimiento almacenado y no se usan en el contexto de ejecución real? En otras palabras, si esto es cierto, una vez que se crea el plan (y suponiendo que se reutilice correctamente), ¿qué importancia tienen las estadísticas "actualizadas"?
Estaba particularmente motivado por un artículo que leí ( Estadísticas, estimaciones de filas y la columna de fecha ascendente ) que describe un escenario muy similar al que enfrento diariamente con varias de las bases de datos de nuestros clientes.
Tenemos una columna de fecha / hora ascendente en una de nuestras tablas más grandes que consultamos regularmente utilizando un procedimiento almacenado específico.
¿Cómo evita que los planes de ejecución se vuelvan obsoletos cuando se agregan cien mil filas al día?
Si estamos actualizando estadísticas con frecuencia para combatir este problema, ¿tendría sentido usar la sugerencia OPTION (RECOMPILE) en la consulta de este procedimiento almacenado?
Cualquier consejo o recomendación sería apreciado.
Actualización : estoy usando SQL Server 2012 (SP1).
fuente
RECOMPILE
no causaría una actualización de estadísticas de todos modos.No, las estadísticas desactualizadas pueden causar una compilación relacionada con la optimización de la declaración afectada.
Los planes de ejecución subóptimos causados por valores predicados que están fuera (específicamente arriba) del rango de valores almacenados en el histograma estadístico correspondiente se conocen como el Problema clave ascendente . Reconstruir estadísticas es una solución posible, pero puede requerir muchos recursos. Las alternativas incluyen:
Traza las banderas 2389 y 2390 . Esto requiere que exista un índice con la columna problemática como clave principal. No funciona con tablas particionadas, y solo es efectivo en SQL Server 2014 si se usa el estimador de cardinalidad original. La marca de seguimiento 4139 también puede ser necesaria si el objeto de estadísticas está marcado como estacionario.
Actualice a SQL Server 2014. El nuevo estimador de cardinalidad incluye lógica para estimar más allá del histograma utilizando información de densidad promedio. Esto puede ser menos preciso que los indicadores de seguimiento 2389/2390 en algunas circunstancias importantes.
Habilite actualizaciones de estadísticas automáticas más frecuentes para tablas grandes con la marca de seguimiento 2371 . Con este indicador de seguimiento, en lugar de actualizar después de 20% + 500 cambios, solo
SQRT(1000 * Table rows)
se requieren modificaciones . Esta no es una solución tan completa como las mencionadas anteriormente, ya que es posible que las actualizaciones aún no se activen con la frecuencia suficiente.Si la fuente de su problema no son tanto las compilaciones de planes frecuentes basadas en valores de predicado más allá del histograma, sino más acerca de los efectos de almacenar ocasionalmente en caché un plan tan malo como resultado de la detección de parámetros, también podría considerar:
OPTIMIZE FOR (@parameter = value)
para compilar un plan para un valor representativo conocidoOPTIMIZE FOR (@parameter UNKNOWN)
para optimizar usando la distribución promedioOPTIMIZE FOR UNKNOWN
(igual que 4136, pero por consulta)OPTION (RECOMPILE)
para compilar cada vez, olfateando el valor particular. Si la gran mayoría de los valores de tiempo de ejecución están dentro del histograma, esto puede ser efectivo.Para obtener más información sobre la detección de parámetros, la integración y las opciones de recompilación, consulte mi artículo en SQLperformance.com.
fuente