Query Store di SQL Server - Che cos'è considerata una query "ad hoc"?


10

Ho fatto un tuffo nel Query Store di SQL Server e vedo spesso riferimenti a query "ad hoc". Tuttavia, non ho visto quale sia il Query Store che determina una query ad hoc. Ho visto posti in cui si poteva dedurre che si trattava di una query senza parametri o di una query eseguita una sola volta. Esiste una definizione formale per questo? Non intendo in generale. Intendo per quanto riguarda il Query Store.

Ad esempio, questa pagina mostra un esempio di rimozione di query ad hoc dall'archivio query, ma sembra che i criteri che sta utilizzando sia un conteggio di esecuzioni di una sola. Questa sembra essere una strana definizione di una query ad hoc. A proposito, se vai alla pagina, cerca "Elimina query ad hoc".



@SqlWorldWide - Ho riformulato la mia domanda. Non intendo in generale. Intendo per quanto riguarda il Query Store.
Randy Minder,

Come è configurato il tuo archivio di query - tutto o auto?
Kin Shah,

@Kin - È impostato come Auto
Randy Minder l'

Risposte:


8

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.

4

Per le query ad hoc, la colonna object_id nel sys.query_store_queryDMV sarà 0, come indicato nella documentazione sys.query_store_query :

object_id :

ID dell'oggetto database di cui fa parte la query (stored procedure, trigger, CLR UDF / UDAgg, ecc.). 0 se la query non viene eseguita come parte di un oggetto database (query ad hoc).

È possibile identificare le query ad hoc in base a quel valore, anche se non è esplicitamente indicato come "questa è la definizione di query ad hoc ". :)


0

Il termine ad-hoc viene utilizzato per fare riferimento a query che sono state eseguite una sola volta. Ciò è coerente con la definizione utilizzata per l'impostazione del database "Ottimizza per carichi di lavoro ad hoc".

Il collegamento a cui fai riferimento riguarda l'eliminazione di query ad hoc include questa definizione specifica "Elimina query ad hoc: elimina le query che sono state eseguite solo una volta e che hanno più di 24 ore".


0

Ad-hoc dalla colonna dmv di objtypesys.dm_exec_cached_plans in docs.microsoft.com.

Adhoc: query ad hoc. Si riferisce a Transact-SQL inviato come eventi di linguaggio utilizzando osql o sqlcmd anziché come chiamate di procedura remote.

Un uso di questa colonna è vedere in caso di query con più piani per vedere se i piani multipli sono causati da 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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.