Magasin de requêtes SQL Server - Qu'est-ce qui est considéré comme une requête «ad hoc»?

10

J'ai fait une plongée profonde dans le magasin de requêtes SQL Server et je vois souvent des références à des requêtes «ad hoc». Cependant, je n'ai pas vu ce que le magasin de requêtes détermine comme une requête ad hoc. J'ai vu des endroits où il pouvait être déduit qu'il s'agissait d'une requête sans paramètres ou d'une requête exécutée une seule fois. Existe-t-il une définition formelle de cela? Je ne veux pas dire en général. Je veux dire en ce qui concerne le magasin de requêtes.

À titre d'exemple, cette page montre un exemple de suppression de requêtes ad hoc du magasin de requêtes, mais il semble que le critère utilisé est un nombre d'exécutions d'un seul. Cela semble être une définition étrange d'une requête ad hoc. BTW, si vous allez sur la page, recherchez «Supprimer les requêtes ad hoc».

Randy Minder
la source
@SqlWorldWide - J'ai reformulé ma question. Je ne veux pas dire en général. Je veux dire en ce qui concerne le magasin de requêtes.
Randy Minder
Comment votre magasin de requêtes est-il configuré - tout ou automatique?
Kin Shah
@Kin - Il est défini sur Auto
Randy Minder

Réponses:

8

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.
LowlyDBA
la source
4

Pour les requêtes ad hoc, la colonne object_id dans le sys.query_store_queryDMV sera 0, comme indiqué dans la documentation sys.query_store_query :

object_id :

ID de l'objet de base de données dont la requête fait partie (procédure stockée, déclencheur, CLR UDF / UDAgg, etc.). 0 si la requête n'est pas exécutée dans le cadre d'un objet de base de données (requête ad hoc).

Vous pouvez identifier les requêtes ad hoc sur la base de cette valeur, même si elle n'est pas explicitement indiquée car "c'est la définition des requêtes ad hoc ". :)

Rigerta Demiri
la source
0

Le terme ad-hoc est utilisé pour faire référence aux requêtes qui n'ont été exécutées qu'une seule fois. Ceci est cohérent avec la définition utilisée pour le paramètre de base de données "Optimiser pour les charges de travail ad-hoc".

Le lien que vous référencez concernant la suppression des requêtes ad hoc inclut cette définition spécifique "Supprimer les requêtes ad hoc: cela supprime les requêtes qui n'ont été exécutées qu'une seule fois et qui ont plus de 24 heures".

Matthew McGiffen
la source
0

Ad-hoc de sys.dm_exec_cached_plans de dmv objtypela colonne docs.microsoft.com.

Adhoc: requête ad hoc. Fait référence à Transact-SQL soumis en tant qu'événements de langage en utilisant osql ou sqlcmd au lieu d'appels de procédure distante.

Une utilisation de cette colonne est de voir en cas de requêtes avec plusieurs plans pour voir si les plans multiples sont causés par Adhoc.

    SELECT  DISTINCT 
        QCP.objtype
        ,MultipleQ.PlanCount
        ,qStat.query_hash
        ,sText.text AS QueryText
FROM ( 
        SELECT query_hash,
               COUNT(query_hash) AS PlanCount
        FROM sys.dm_exec_query_stats
        GROUP BY query_hash
    ) AS MultipleQ
INNER JOIN sys.dm_exec_query_stats qStat ON MultipleQ.query_hash = qStat.query_hash
INNER JOIN sys.dm_exec_cached_plans  QCP
    ON QCP.plan_handle = qStat.plan_handle
CROSS APPLY sys.dm_exec_sql_text(qStat.sql_handle) AS sText
CROSS APPLY sys.dm_exec_query_plan(qStat.plan_handle) AS qp
WHERE PlanCount > 1
ORDER BY MultipleQ.PlanCount DESC
LCJ
la source