Étant donné les constantes suivantes:
- La même base de données avec la même structure (tables, index, etc.)
- Les mêmes données
- La même configuration de SQL Server et du matériel
- Les mêmes statistiques
- Les mêmes options SET dans le client
- Les mêmes versions de SQL Server
- Les mêmes indicateurs de trace
Compte tenu de ces constantes, SQL Server produira-t-il toujours le même plan pour une requête donnée?
Sinon, y a-t-il d'autres considérations? Y a-t-il également un élément de non-déterminisme à prendre en compte?
sql-server
execution-plan
determinism
James L
la source
la source
Réponses:
La compilation des requêtes est déterministe pour autant que je sache. L'un des objectifs de conception d'origine de QO était qu'il devrait être possible de reproduire les plans d'exécution sur un système différent en utilisant une copie uniquement statistique de la base de données. Il y a quelques subtilités à cela, autour des paramètres de configuration comme la quantité de mémoire disponible et le nombre de processeurs logiques, mais ceux-ci sont couverts par votre liste de choses à synchroniser.
Mise en garde: Cela est vrai à condition que le mot «même» dans votre liste soit considéré comme signifiant exactement le même à tous égards . Par exemple, les «mêmes» statistiques peuvent exister sur les deux systèmes, mais elles ne sont exactement les mêmes que si les étapes de l'histogramme et les informations de densité sont identiques .
Cela dit, le processus d'optimisation est également extrêmement complexe , ce qui signifie qu'il peut être difficile de garantir que toutes les entrées de ce processus déterministe sont identiques et que tous les états internes sont suffisamment similaires pour garantir que le même chemin de code est emprunté par l'optimiseur pour un particulier. compilation. Si la requête contient un accès en dehors de la base de données (vers une autre base de données ou instance), ces environnements doivent également être identiques.
Une chose que j'ajouterais à votre liste est de vérifier que tous les guides de plan existent également dans la deuxième base de données.
L'utilisation de fonctions non déterministes comme
GETDATE()
dans les requêtes peut également signifier que vous obtenez un plan différent. Bien que l'optimiseur principal n'utilise pas directement la valeur, l'estimation de cardinalité peut (voir Évaluation du pliage constant et de l'expression pendant l'estimation de cardinalité ). Je ne sais pas si cette classe de différence entre dans le champ d'application de la question, car les deux systèmes produiraient le même plan s'ils étaient exécutés en même temps (ou, plus généralement, avec les mêmes variables d'entrée, paramètres et valeurs de fonction).la source