Est-il possible de donner à l'optimiseur plus ou tout le temps dont il a besoin?

18

Étant donné que l'optimiseur ne peut pas prendre tout le temps dont il a besoin (il doit minimiser le temps d'exécution et ne pas y contribuer) pour explorer tous les plans d'exécution possibles, il est parfois interrompu.

Je me demandais si cela pouvait être annulé pour que vous puissiez donner à l'optimiseur tout le temps nécessaire (ou un certain nombre de millisecondes).

Je n'ai pas besoin de cela (atm) mais je peux imaginer un scénario où une requête complexe est exécutée dans une boucle serrée et que vous souhaitez trouver le plan optimal et le mettre en cache au préalable.

Bien sûr, si vous avez une boucle serrée, vous devez réécrire la requête pour qu'elle disparaisse, mais restez avec moi.

C'est plus une question par curiosité et aussi pour voir s'il y a parfois une différence entre une optimisation court-circuitée et une optimisation complète.

Il s'avère que vous pouvez donner plus de temps à l'optimiseur avec l'indicateur de trace 2301. Ce n'est pas exactement ce que je demandais, mais il se rapproche.

La meilleure information que j'ai trouvée à ce sujet se trouve dans les extensions de modélisation de processeur de requête dans SQL Server 2005 SP1 par Ian Jose.

Utilisez ce drapeau de trace avec précaution! Mais cela peut être utile pour trouver de meilleurs plans. Voir également:

Je pensais aux requêtes avec beaucoup de jointures où l'espace de solution pour l'ordre des jointures explose de façon exponentielle. L'heuristique utilisée par SQL Server est plutôt bonne, mais je me demandais si l'optimiseur proposerait un ordre différent s'il avait plus de temps (de l'ordre de quelques secondes ou même de quelques minutes).

Buckley
la source

Réponses:

16

À côté du drapeau 2301, il y a 8780, ce qui rend vraiment l'optimiseur `` plus difficile '' car il lui donne juste plus de temps (non illimité, comme décrit en détail ici (russe) et moins détaillé ici ) pour faire son travail.

Description détaillée en anglais de l'auteur original de l'article russe. qui comprend l'avertissement de l'auteur:

il n'est pas recommandé de l'utiliser dans la production .

Combiner les deux et les appliquer (de manière très sélective via l'option de requête OPTION (QUERYTRACEON 2301, QUERYTRACEON 8780) à une requête de TVF en ligne imbriqués à 4 niveaux (où seul celui du bas ferait un vrai travail et les niveaux supérieurs corréleraient les résultats via les sous-requêtes EXISTS) a donné lieu à une belle MERGE JOIN et plusieurs LAZY SPOOLs qui ont réduit de moitié le temps d'exécution.

ENOTTY
la source
4

Non, tu ne peux pas.

Vous pouvez rendre vos requêtes "optimisantes" en comprenant comment cela fonctionne (bête complexe, pas besoin de la connaître à l'envers). Je suggérerais que si vous avez quelque chose de si critique en temps, corrigez la requête plutôt que de changer le fonctionnement de SQL Server.

Par exemple, vous voudriez savoir quand une requête commence à évoluer moins efficacement que O (n) à mesure que le volume de données + la distribution des données changent: donner plus de temps à l'optimiseur n'ajoute aucune valeur ici.

gbn
la source