Sabemos que a estrutura do memorando é removida e alguns planos alternativos caros são descartados durante a otimização. Eu queria saber se existe alguma maneira de evitar isso e deixar o otimizador considerar apenas todos os planos possíveis e selecionar o melhor de todas as alternativas?
sql-server
optimization
zli89
fonte
fonte
a hash join b
custará 10 ou mais, por que calcular todos esses milhões de planos e não podá-los? (não que o otimizador funciona de uma maneira tão simplista)Respostas:
Existe, mas não o divulgo porque seria mal compreendido e mal aplicado. De qualquer forma, isso não resultaria em uma pesquisa exaustiva do espaço do plano, porque apenas um conjunto limitado de transformações (aquelas que geralmente produzem bons resultados) são implementadas.
Prevenir a poda e o descarte geralmente resultaria simplesmente em (muito) tempos de compilação mais longos sem muita melhoria na qualidade final do plano, se houver.
Por fim, a pergunta é natural e razoável, mas se baseia em um mal-entendido dos objetivos do otimizador de consultas do SQL Server: foi desenvolvido para encontrar rapidamente bons planos para consultas comuns. Não foi criado em uma estrutura projetada para pesquisa exaustiva.
Se você tiver uma situação do mundo real que se beneficiaria de uma abordagem diferente da otimização, poderia argumentar no site do Connect (embora eu ache improvável que a Microsoft invista os recursos de engenharia necessários).
fonte
Sei que não existe um botão ou sinalizador de rastreamento para coagir esse comportamento (embora Paul White mencione aqui alguns sinalizadores de rastreamento que fornecem mais visibilidade e permitem persuadir alguns deltas de comportamento ).
A Microsoft fornece muitas armas, mas é quase garantido que esta esteja apontando diretamente para seus próprios pés, 100% do tempo. Ao executar uma consulta pela primeira vez, não acho que você queira que o SQL Server gaste uma quantidade infinita de tempo construindo todas as variações possíveis de um plano para obter os resultados desejados. Como o @ypercube menciona, esse pode ser um número muito grande de planos, e meio que anula o objetivo de executar a consulta. Seu objetivo ao executar uma consulta em primeiro lugar, presumivelmente, é retornar dados em algum momento, certo? E "algum ponto" deve estar dentro de certos limites, pois determinadas camadas do seu aplicativo terão vários tempos limite de consulta / comando aplicados, e os usuários aguardarão apenas o tempo de carregamento de uma página ...
fonte