Existe alguma maneira de impedir que a estrutura do memorando seja removida?

8

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?

zli89
fonte
3
Não está claro o que você deseja impedir. Deseja forçar de alguma forma o otimizador a calcular um custo para todos os planos possíveis (que podem chegar a trilhões de zilhões, mesmo para uma consulta simples com 10 junções)?
ypercubeᵀᴹ
sim, embora não pareça possível. Gostaria de forçar o otimizador a considerar todos os planos possíveis, calcular seus custos e escolher o mais barato.
Zli89
4
E por que deveria fazer isso? Se ele calculou, digamos, um plano com custo = 7 e, em seguida, conclua que qualquer plano que inclua a hash join bcustará 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)
ypercubeᵀᴹ

Respostas:

12

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?

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).

Paul White 9
fonte
9

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 ...

Aaron Bertrand
fonte