Dopo un po 'di ricerche, non sono riuscito a trovare una fonte concreta e soddisfacente dalla documentazione di Microsoft per rispondere a questa domanda. Ci sono molte buone descrizioni e definizioni di terze parti di adhoc / ad-hoc / ad hoc là fuori, ma per la specificità di questa domanda penso che una vicino alla fonte sia l'ideale.
Spostando le definizioni generiche (ma ancora accurate) come questo post SO (grazie a SqlWorldWide), se guardiamo cosa dice la documentazione sull'argomento, è d'accordo con ciò che hai menzionato sulla definizione in base al numero di esecuzioni , Penso al punto che possiamo prenderlo come un dato di fatto.
L'articolo sull'ottimizzazione per flussi di lavoro ad hoc dice:
Quando questa opzione è impostata su 1, Motore di database memorizza un piccolo stub di piano compilato nella cache del piano quando un batch viene compilato per la prima volta, anziché il piano compilato completo. Questo aiuta ad alleviare la pressione della memoria impedendo che la cache del piano si riempia di piani compilati che non vengono riutilizzati. Lo stub del piano compilato consente al Motore di database di riconoscere che questo batch ad hoc è stato compilato in precedenza ma ha archiviato solo uno stub del piano compilato, quindi quando questo batch viene richiamato (compilato o eseguito) di nuovo, il Motore di database compila il batch ... e aggiunge l'intero piano compilato alla cache del piano.
Quindi sembrerebbe che l'opzione di configurazione del server di query ad hoc usi anche la definizione di una singola esecuzione come definizione di ad hoc. Se la query continua a essere eseguita e genera lo stesso piano, non verrebbe più trattata come tale.
L'articolo su Best Practices for Query Store si allinea anche a questo,
Confronta il numero di valori query_hash distinti con il numero totale di voci in sys.query_store_query. Se il rapporto è vicino a 1, il carico di lavoro ad hoc genera query diverse.
Questo, ovviamente, è per le query che non sono già utilizzate come stored procedure, parametrizzate, ecc. Perché possono essere riconosciute e trattate in modo appropriato fin dall'inizio.
Quindi, in base a tutto ciò, possiamo dire che una query viene trattata come ad hoc se:
- Non è parametrizzato
- Non è memorizzato a livello di codice nel database (proc, funzione, trigger, ecc. Memorizzati)
- La stessa query viene eseguita una sola volta OPPURE La stessa query viene eseguita più volte ma genera un piano di query diverso per ogni successiva esecuzione.