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.
sql-server
optimization
zli89
fuente
fuente
a hash join b
costará 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)Respuestas:
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).
fuente
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 ...
fuente