Après un peu de recherche, je n'ai pas pu trouver une source concrète et satisfaisante dans la documentation de Microsoft pour répondre à cette question. Il existe de nombreuses bonnes descriptions et définitions par des tiers d'adhoc / ad-hoc / ad hoc, mais pour la spécificité de cette question, je pense qu'une approche proche de la source est idéale.
En dépassant les définitions génériques (mais toujours exactes) comme ce message SO (merci SqlWorldWide), si nous regardons ce que la documentation dit sur le sujet, cela correspond à ce que vous avez mentionné à propos de la définition basée sur le nombre d'exécutions , Je pense que nous pouvons le considérer comme un fait.
L'article sur l' optimisation des flux de travail ad hoc dit,
Lorsque cette option est définie sur 1, le moteur de base de données stocke un petit talon de plan compilé dans le cache de plan lorsqu'un lot est compilé pour la première fois, au lieu du plan compilé complet. Cela permet de réduire la pression sur la mémoire en ne permettant pas au cache de plan de se remplir de plans compilés qui ne sont pas réutilisés. Le talon de plan compilé permet au moteur de base de données de reconnaître que ce lot ad hoc a été compilé auparavant mais n'a stocké qu'un talon de plan compilé.Ainsi, lorsque ce lot est à nouveau invoqué (compilé ou exécuté), le moteur de base de données compile le lot ... et ajoute le plan compilé complet au cache du plan.
Il semblerait donc que l'option de configuration du serveur de requêtes ad hoc utilise également la définition d'une exécution unique comme définition d'ad hoc. Si la requête continue d'être exécutée et génère le même plan, elle ne sera plus traitée comme telle.
L'article sur les meilleures pratiques pour Query Store est également conforme à cela,
Comparez le nombre de valeurs distinctes de query_hash avec le nombre total d'entrées dans sys.query_store_query. Si le ratio est proche de 1, votre charge de travail ad-hoc génère différentes requêtes.
Bien sûr, cela concerne les requêtes qui ne sont pas déjà utilisées comme procédures stockées, paramétrées, etc. car elles peuvent être reconnues et traitées de manière appropriée dès le départ.
Donc, sur la base de tout cela, nous pouvons dire qu'une requête est traitée comme ad hoc si:
- Il n'est pas paramétré
- Il n'est pas stocké par programme dans la base de données (proc stocké, fonction, déclencheur, etc.)
- La même requête n'est exécutée qu'une seule fois OU La même requête est exécutée plusieurs fois mais génère un plan de requête différent pour chaque exécution suivante.