La fonction Forcer le Plan Forcer Store ne fonctionne pas

12

La fonctionnalité de plan Query Store Force ne semble pas appliquer le plan.

Je connais Query Store - forcé ne signifie pas toujours forcé ; cependant, mon plan peut ne pas changer de manière insignifiante, mais l'optimiseur de requêtes peut continuer à choisir des index, des choix de boucle incorrects, etc.

Fondamentalement: il n'honore pas mon choix de plan forcé. J'ai forcé de nombreux plans et ça ne fonctionne pas .

  1. Il y a 0 nombre d'échecs ou raisons quand je regarde sys.query_store_plan force_failure_count.
  2. L'événement étendu query_store_plan_forcing_failedne produit rien. 0 événements.

Par exemple, un plan qui a été forcé le 20.09. Une seule compilation est arrivée à utiliser un plan forcé.

Plans pour la requête

Les plans diffèrent énormément, l'un utilisant la jointure Hash Match avec INDEX 1, l'autre utilisant la jointure en boucle avec INDEX 2.

Différents plans

Version: Microsoft SQL Server 2016 (SP1-GDR) (KB3210089) - 13.0.4202.2 (X64)

Qu'est-ce que j'oublie ici?

Janis Veinbergs
la source

Réponses:

16

De sys.query_store_plan (Transact-SQL) (emphase ajoutée)

Planifier les limitations de forçage

Query Store dispose d'un mécanisme pour appliquer Query Optimizer à certains plans d'exécution. Cependant, certaines limites peuvent empêcher l'exécution d'un plan .

Premièrement, si le plan contient les constructions suivantes:

  • Insérez une déclaration groupée.
  • Référence à une table externe
  • Requête distribuée ou opérations de texte intégral
  • Utilisation des requêtes globales
  • Curseurs
  • Spécification de jointure en étoile non valide

Vous utilisez un curseur.


Vous pouvez souvent forcer un plan de curseur avec un guide de plan à la place. Voir Utilisation de l'indicateur de requête USE PLAN sur les requêtes avec curseurs .

Et oui, je suis d'accord que la situation actuelle ne permet pas la meilleure expérience utilisateur. Je m'attendrais à ce que tenter de forcer un plan pour quelque chose qui ne peut pas (actuellement) être forcé déclencherait une erreur ou un avertissement, ou enregistrerait quelque chose. Vous pouvez connecter un élément de rétroaction pour demander une amélioration dans ce domaine.


À partir de SQL 2019 CTP 2.3, le plan d'exécution de requêtes forcées pour les curseurs Fast Forward et Static est pris en charge

Query Store prend désormais en charge la possibilité de forcer les plans d'exécution des requêtes pour les curseurs T-SQL et API rapides et statiques. Le forçage est désormais pris en charge via sp_query_store_force_planou via les rapports du magasin de requêtes SQL Server Management Studio.

Paul White 9
la source