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