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.