¿Hay alguna forma de evitar que se pode la estructura de la nota?

8

Sabemos que la estructura de la nota se poda y algunos planes alternativos caros se descartan durante la optimización. Me preguntaba si hay alguna manera de evitar esto y dejar que el optimizador solo considere todos los planes posibles y seleccione el mejor de todas las alternativas.

zli89
fuente
3
No está claro lo que quieres evitar. ¿Desea forzar de alguna manera al optimizador a calcular un costo para todos los planes posibles (que pueden estar en billones de billones, incluso para una consulta simple con 10 combinaciones)?
ypercubeᵀᴹ
Sí, aunque no parece posible. Me gustaría obligar al optimizador a considerar todos los planes posibles, calcular sus costos y luego elegir el más barato.
zli89
44
¿Y por qué debería hacer eso? Si ha calculado, digamos, un plan con costo = 7, y luego encuentra que cualquier plan que incluya a hash join bcostará 10 o más, ¿por qué calcular todos esos millones de planes y no podarlos? (no es que el optimizador funcione de una manera tan simplista)
ypercubeᵀᴹ

Respuestas:

12

Sabemos que la estructura de la nota se poda y algunos planes alternativos caros se descartan durante la optimización. Me preguntaba si hay alguna forma de evitar esto y dejar que el optimizador solo considere todos los planes posibles y seleccione el mejor de todas las alternativas.

Lo hay, pero no lo publico porque sería mal entendido y mal aplicado. En cualquier caso, no resultaría en una búsqueda exhaustiva del espacio del plan porque solo se implementa un conjunto limitado de transformaciones (las que comúnmente producen buenos resultados).

La prevención de la poda y el descarte en general simplemente daría lugar a tiempos de compilación (mucho) más largos sin una gran mejora en la calidad del plan final, si corresponde.

En última instancia, la pregunta es natural y razonable, pero se basa en un malentendido de los objetivos del optimizador de consultas de SQL Server: está diseñado para encontrar rápidamente buenos planes para consultas comunes. No se basa en un marco diseñado para una búsqueda exhaustiva.

Si tiene una situación del mundo real que se beneficiaría de un enfoque diferente para la optimización, podría exponerlo en el sitio web de Connect (aunque creo que es poco probable que Microsoft invierta los recursos de ingeniería necesarios).

Paul White 9
fuente
9

No conozco ninguna perilla o indicador de seguimiento que coaccione este comportamiento de ninguna manera (aunque Paul White menciona algunos indicadores de seguimiento aquí que proporcionan más visibilidad y le permiten persuadir algunos deltas de comportamiento ).

Microsoft proporciona un montón de armas, pero es casi seguro que apuntará directamente a sus propios pies el 100% del tiempo. Cuando ejecuto una consulta por primera vez, no creo que quiera que SQL Server pase una cantidad infinita de tiempo construyendo cada variación posible de un plan para obtener los resultados deseados. Como @ypercube menciones, esto podría ser un muy gran número de planes, y lo haría tipo de derrota el propósito de ejecutar la consulta en absoluto. Su objetivo al ejecutar una consulta en primer lugar, presumiblemente, es devolver datos en algún momento, ¿verdad? Y "algún punto" debe estar dentro de ciertos umbrales, ya que ciertas capas de su aplicación tendrán varios tiempos de espera de consulta / comando, y los usuarios solo esperarán tanto tiempo para que se cargue una página ...

Aaron Bertrand
fuente