SQL Server Query Store: ¿qué se considera una consulta 'ad-hoc'?

10

He estado profundizando en el almacén de consultas de SQL Server y a menudo veo referencias a consultas 'ad-hoc'. Sin embargo, no he visto lo que el almacén de consultas determina que sea una consulta ad-hoc. He visto lugares donde se podría inferir que es una consulta sin parámetros o una consulta ejecutada solo una vez. ¿Existe una definición formal para esto? No me refiero en general. Me refiero a lo que se refiere a la tienda de consultas.

Como ejemplo, esta página muestra un ejemplo de eliminación de consultas ad-hoc del almacén de consultas, pero parece que el criterio que está utilizando es un recuento de ejecución de solo uno. Esto parece ser una definición extraña de una consulta ad-hoc. Por cierto, si va a la página, busque 'Eliminar consultas ad-hoc'.

Randy Minder
fuente
@SqlWorldWide - He reformulado mi pregunta. No me refiero en general. Me refiero a lo que se refiere a la tienda de consultas.
Randy Minder
¿Cómo se configura su almacén de consultas, todo o automático?
Kin Shah
@Kin - Está configurado como Auto
Randy Minder

Respuestas:

8

Después de un poco de búsqueda, no pude encontrar una fuente concreta y satisfactoria de la documentación de Microsoft para responder esta pregunta. Hay muchas buenas descripciones de terceros y definiciones de adhoc / ad-hoc / ad hoc, pero para la especificidad de esta pregunta, creo que una cercana a la fuente es ideal.

Pasando definiciones genéricas (pero aún precisas) como esta publicación SO (gracias SqlWorldWide), si miramos lo que dice la documentación sobre el tema, está de acuerdo con lo que ha mencionado sobre la definición basada en el número de ejecuciones Creo que hasta el punto podemos tomarlo como un hecho.

El artículo sobre optimización para flujos de trabajo ad hoc dice:

Cuando esta opción se establece en 1, el Motor de base de datos almacena un pequeño trozo de plan compilado en la memoria caché del plan cuando se compila un lote por primera vez, en lugar del plan compilado completo. Esto ayuda a aliviar la presión de la memoria al no permitir que el caché del plan se llene con planes compilados que no se reutilizan. El apéndice del plan compilado permite que el Motor de base de datos reconozca que este lote ad hoc se ha compilado antes, pero solo ha almacenado un apéndice del plan compilado, por lo que cuando se invoca (compila o ejecuta) este lote, el Motor de base de datos compila el lote ... y agrega el plan compilado completo a la caché del plan.

Por lo tanto, parece que la opción de configuración del servidor de consultas ad hoc también utiliza la definición de una ejecución única como la definición de ad hoc. Si la consulta continúa ejecutándose y genera el mismo plan, ya no se tratará como tal.

El artículo sobre Mejores prácticas para Query Store también se alinea con esto,

Compare el número de valores distintos de query_hash con el número total de entradas en sys.query_store_query. Si la proporción es cercana a 1, su carga de trabajo ad-hoc genera consultas diferentes.

Esto, por supuesto, es para consultas que aún no se utilizan como procedimientos almacenados, parametrizados, etc. porque pueden reconocerse y tratarse de manera adecuada desde el principio.

Entonces, en base a todo esto, podemos decir que una consulta se trata como ad hoc si:

  • No esta parametrizado
  • No se almacena programáticamente en la base de datos (proceso almacenado, función, disparador, etc.)
  • La misma consulta solo se ejecuta una vez O La misma consulta se ejecuta varias veces, pero genera un plan de consulta diferente para cada ejecución posterior.
LowlyDBA
fuente
4

Para consultas ad-hoc, la columna object_id en el sys.query_store_queryDMV será 0, como se indica en la documentación sys.query_store_query :

object_id :

Id. Del objeto de la base de datos del que forma parte la consulta (procedimiento almacenado, desencadenador, CLR UDF / UDAgg, etc.). 0 si la consulta no se ejecuta como parte de un objeto de base de datos (consulta ad-hoc).

Puede identificar consultas ad-hoc en función de ese valor, aunque no se indique explícitamente como "esta es la definición de consultas ad-hoc ". :)

Rigerta Demiri
fuente
0

El término ad-hoc se usa para referirse a consultas que solo se han ejecutado una vez. Esto es coherente con la definición utilizada para la configuración de la base de datos "Optimizar para cargas de trabajo ad-hoc".

El enlace que hace referencia a la eliminación de consultas ad-hoc incluye esta definición específica "Eliminar consultas ad-hoc: esto elimina las consultas que solo se ejecutaron una vez y que tienen más de 24 horas".

Matthew McGiffen
fuente
0

Ad-hoc de sys.dm_exec_cached_plans del DMV objtypecolumna en docs.microsoft.com.

Adhoc: consulta ad hoc. Se refiere a Transact-SQL enviado como eventos de lenguaje utilizando osql o sqlcmd en lugar de llamadas a procedimientos remotos.

Un uso de esta columna es ver en caso de consultas con múltiples planes para ver si los múltiples planes son causados ​​por 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
fuente