Condividi tramite


sys.dm_exec_query_memory_grants (Transact-SQL)

Restituisce informazioni sulle query a cui è stata concessa memoria o che sono ancora in attesa di riceverla. Le query che non sono in attesa di una concessione di memoria non saranno incluse in tale vista.

Nome colonna

Tipo di dati

Descrizione

session_id

smallint

ID (SPID) della sessione nella quale viene eseguita la query.

request_id

int

ID della richiesta. Valore univoco nel contesto della sessione.

scheduler_id

int

ID dell'utilità di pianificazione che sta pianificando la query.

dop

smallint

Grado di parallelismo della query.

request_time

datetime

Data e ora in cui la query ha richiesto la concessione di memoria.

grant_time

datetime

Data e ora in cui la memoria è stata concessa alla query. È NULL se la memoria non è stata ancora concessa.

requested_memory_kb

bigint

Quantità totale di memoria richiesta, espressa in kilobyte.

granted_memory_kb

bigint

Quantità totale di memoria effettivamente concessa, espressa in kilobyte. Può essere NULL se la memoria non è stata ancora concessa. In una situazione tipica questo valore dovrebbe corrispondere al valore di requested_memory_kb. In caso di creazione di indici, il server può concedere ulteriore memoria su richiesta in aggiunta alla memoria concessa inizialmente.

required_memory_kb

bigint

Quantità minima di memoria necessaria per l'esecuzione della query, espressa in kilobyte. Il valore di requested_memory_kb è maggiore o uguale a questa quantità.

used_memory_kb

bigint

Memoria fisica attualmente in uso, espressa in kilobyte.

max_used_memory_kb

bigint

Memoria fisica massima utilizzata fino a questo momento, espressa in kilobyte.

query_cost

float

Costo stimato della query.

timeout_sec

int

Timeout in secondi prima che la query rinunci alla richiesta di concessione di memoria.

resource_semaphore_id

smallint

ID non univoco del semaforo di risorsa sul quale la query è in attesa.

NotaNota
L'ID è univoco nelle versioni di SQL Server precedenti a SQL Server 2008. La modifica può influire sulla risoluzione dei problemi relativi all'esecuzione di query. Per ulteriori informazioni, vedere la sezione "Osservazioni" di seguito in questo argomento.

queue_id

smallint

ID della coda nella quale la query sta attendendo la concessione di memoria. È NULL se la memoria è già stata concessa.

wait_order

int

Ordine sequenziale delle query in attesa all'interno del queue_id specificato. Questo valore può variare in caso di timeout o di concessione di memoria ad altre query. È NULL se la memoria è già stata concessa.

is_next_candidate

bit

Candidato alla concessione di memoria successiva.

1 = Sì

0 = No

NULL = Memoria già concessa

wait_time_ms

bigint

Periodo di attesa espresso in millisecondi. È NULL se la memoria è già stata concessa.

plan_handle

varbinary(64)

Identificatore del piano di query. Utilizzare sys.dm_exec_query_plan per estrarre il piano XML effettivo.

sql_handle

varbinary(64)

Identificatore del testo Transact-SQL della query. Utilizzare sys.dm_exec_sql_text per ottenere il testo Transact-SQL effettivo.

group_id

int

ID per il gruppo del carico di lavoro nel quale viene eseguita la query.

pool_id

int

ID del pool di risorse a cui appartiene il gruppo del carico di lavoro.

is_small

tinyint

Se il valore è 1, questa concessione utilizza il semaforo piccolo di risorsa. Se il valore è 0, viene utilizzato un semaforo normale.

ideal_memory_kb

bigint

Dimensioni, in kilobyte (KB), della concessione di memoria per inserire tutto nella memoria fisica. Si basa su una stima della cardinalità.

Autorizzazioni

È richiesta l'autorizzazione VIEW SERVER STATE per il server.

Osservazioni

Di seguito è illustrato un tipico scenario di debug per il timeout delle query:

  • Verificare lo stato complessivo della memoria di sistema utilizzando sys.dm_os_memory_clerks, sys.dm_os_sys_info e diversi contatori di prestazioni.

  • Verificare le prenotazioni di memoria per l'esecuzione di query in sys.dm_os_memory_clerks dove type = 'MEMORYCLERK_SQLQERESERVATIONS'.

  • Verificare le query in attesa di concessione di memoria utilizzando sys.dm_exec_query_memory_grants.

  • Esaminare in maggiore dettaglio le query che utilizzano una quantità elevata di memoria utilizzando sys.dm_exec_requests.

  • Se si sospetta la presenza di una query runaway, esaminare lo Showplan di sys.dm_exec_query_plan e il testo del batch di sys.dm_exec_sql_text.

Le query che utilizzano viste a gestione dinamica con incluse clausole ORDER BY o funzioni di aggregazione potrebbero aumentare l'utilizzo della memoria, contribuendo di conseguenza a causare il problema che dovrebbero risolvere.

La funzionalità Resource Governor consente a un amministratore del database di distribuire risorse del server fra un massimo di 20 pool di risorse. In SQL Server 2008, ogni pool si comporta come una piccola istanza indipendente del server e richiede 2 semafori. Il numero di righe restituite da sys.dm_exec_query_resource_semaphores può essere fino a 20 volte superiore alle righe restituite in SQL Server 2005.