Quão determinística é a criação do plano de execução no SQL Server?

13

Dadas as seguintes constantes:

  • O mesmo banco de dados com a mesma estrutura (tabelas, índices, etc)
  • Os mesmos dados
  • A mesma configuração do SQL Server e de hardware
  • As mesmas estatísticas
  • As mesmas opções SET no cliente
  • As mesmas versões do SQL Server
  • Os mesmos sinalizadores de rastreamento

Dadas essas constantes, o SQL Server sempre produzirá o mesmo plano para uma determinada consulta?

Caso contrário, existem outras considerações? Existe também um elemento de não-determinismo a considerar também?

James L
fonte
será incorreto dizer o mesmo plano, mas podemos dizer um plano semelhante. Juntamente com os fatores externos que o DBA / Developer pode controlar; "algoritmos de otimização do plano de consulta" e "algoritmos internos de custo de consulta" são gravados no mecanismo do servidor SQL. não temos esse controle de dizer "o que escolher" de todas as maneiras. podemos definir um ambiente externo para orientar o mecanismo para escolher a melhor. para uma determinada consulta, se o otimizador tiver dois planos de execução, digamos 0,001 de diferença de custo, acho que será irrelevante qual plano de execução ele escolher.
Anup Shah
Eu não acho que você deveria ser teórico sobre isso. Trabalhei 25 anos com diferentes bancos de dados e quase sempre é possível reescrever uma consulta para executar melhor. E às vezes é muito difícil entender por que é melhor com uma maneira de escrever a consulta.

Respostas:

13

Dadas essas constantes, o SQL Server sempre produzirá o mesmo plano para uma determinada consulta? Caso contrário, existem outras considerações? Existe também um elemento de não-determinismo a considerar também?

A compilação de consultas é determinística, até onde eu saiba. Um dos objetivos originais de design de QO era que deveria ser possível reproduzir planos de execução em um sistema diferente usando uma cópia apenas estatística do banco de dados. Existem algumas sutilezas nisso: parâmetros de configuração, como a quantidade de memória disponível e o número de processadores lógicos, mas estes são cobertos pela sua lista de itens a serem sincronizados.

Advertência: Isso é verdade, desde que a palavra 'mesmo' na sua lista seja considerada exatamente igual em todos os aspectos . Por exemplo, as estatísticas 'mesmas' podem existir nos dois sistemas, mas são exatamente iguais se as etapas do histograma e as informações de densidade forem idênticas .

Dito isso, o processo de otimização também é extremamente complexo , o que significa que pode ser difícil garantir que todas as entradas desse processo determinístico sejam idênticas e que todos os estados internos sejam semelhantes o suficiente para garantir que o mesmo caminho de código seja percorrido pelo otimizador para um determinado compilação. Se a consulta contiver acesso fora do banco de dados (para outro banco de dados ou instância), esses ambientes também deverão ser idênticos.

Uma coisa que eu acrescentaria à sua lista é verificar se existem guias de plano no segundo banco de dados.


O uso de funções não determinísticas, como GETDATE()nas consultas, pode significar que você também tenha um plano diferente. Embora o otimizador principal não use o valor diretamente, a estimativa de cardinalidade pode (consulte Avaliação de dobras e expressões constantes durante a estimativa de cardinalidade ). Não tenho certeza se essa classe de diferença se enquadra no escopo da pergunta, porque ambos os sistemas produziriam o mesmo plano se executados ao mesmo tempo (ou, mais geralmente, com as mesmas variáveis ​​de entrada, parâmetros e valores de função).

Paul White 9
fonte