Tengo una base de datos SQL Server 2012. Noté el valor de Reason for early termination of statement optimization
algunas consultas y todas me dieron Good Enough Plan Found
. Ahora mis preguntas son:
- ¿Cuáles son todos los tipos posibles de "Motivo de la terminación anticipada de la optimización de declaraciones" Busqué esto en msdn pero no obtuve una lista completa de valores.
¿Existe un DMV o un evento extendido para enumerar todas las consultas para las cuales se finalizó la optimización debido a razones distintas a Good Enough Plan Found? Me referí a dos artículos que no enumeran la lista completa de posibilidades. [Además, me dan un resultado diferente en mi base de datos].
Respuestas:
Límite de memoria excedido
El optimizador se vio obligado a dejar de buscar mejores alternativas de plan debido a la presión de la memoria. La razón de esto debe investigarse y corregirse, luego intentar la compilación de consultas nuevamente. Es muy posible que el plan devuelto no sea el que el optimizador hubiera seleccionado si la condición de poca memoria no existiera.
Se acabó el tiempo
Esta razón es muy mal entendida .
El optimizador de consultas tiene como objetivo encontrar un plan razonable rápidamente . No realiza una búsqueda exhaustiva para encontrar el mejor plan posible. Por diseño, evita pasar más tiempo de optimización de lo necesario. Una de estas características que funciona para garantizar esto es el "tiempo de espera" (no es una medida de tiempo).
El optimizador se establece un "presupuesto de exploración" basado en la complejidad de la consulta lógica, las estimaciones de cardinalidad y el costo estimado del plan más barato encontrado hasta ahora (si corresponde). Las consultas más complejas con mayor cardinalidad reciben un presupuesto más alto.
Si se supera este presupuesto durante una de sus fases de búsqueda, la fase finaliza. Esto es parte del diseño y el funcionamiento normal del optimizador. Las consultas que necesitan más esfuerzo optimizador lo obtienen; los que no, no.
Piense en 'Time Out' como 'Good Enough Plan Found'.
Buen plan suficiente encontrado
Esto significa exactamente lo mismo que un motivo en blanco. Es simplemente una peculiaridad histórica que los planes con un costo inferior a 0,909090 ... (1 / 1.1) se etiquetan de esta manera. Nada se detiene antes o se maneja de manera especial o diferente dentro del código del optimizador cuando aparece este motivo.
Aparte del límite de memoria excedido, ninguna de las 'razones de terminación temprana' significan mucho (si es que hay algo) para el ajuste de consultas o el análisis de rendimiento. Generalmente los ignoro.
Consejo
Dirija los esfuerzos de ajuste de consultas basados en métricas de rendimiento real (tiempo transcurrido, uso de CPU / memoria, ... lo que sea importante en contexto). Si una consulta es demasiado lenta para el propósito previsto, dedique tiempo a acelerarla. Mida el rendimiento real, compárelo con la línea de base y el historial, y apunte el esfuerzo de ajuste en las variaciones importantes.
Almacene datos limpios garantizados en un esquema relacional adecuado, con estadísticas e índices útiles y consultas bien escritas y optimizadas para el optimizador.
fuente
Si va a http://schemas.microsoft.com/sqlserver/2004/07/showplan/showplanxml.xsd (que es el enlace que verá si abre un plan de ejecución como xml), verá el tres razones enumeradas, que son:
Los artículos que menciona parecen estar bien para encontrar estos eventos, ¿tiene algún problema específico? Lo único a tener en cuenta es que estos DMV no capturan todos los comandos SQL que se ejecutan en el servidor y se restablecen cuando el servidor se reinicia. Podría atrapar showplan xml con Extended Events y consultar eso, pero me parece excesivo.
Tampoco me preocuparía demasiado por GoodEnoughPlanFound, parece que el optimizador está haciendo su trabajo (de encontrar un buen plan rápidamente) bastante bien.
HTH
fuente