sys.dm_exec_query_memory_grants (Transact-SQL)
Si applica a: SQL Server Azure SQL Database
Istanza gestita di SQL di Azure Azure Synapse
Analytics Analytics
Platform System (PDW)
Restituisce informazioni su tutte le query richieste e in attesa di una concessione di memoria o di una concessione di memoria. Le query che non richiedono una concessione di memoria non verranno visualizzate in questa visualizzazione. Ad esempio, le operazioni di ordinamento e join hash hanno concessioni di memoria per l'esecuzione di query, mentre le query senza una clausola non avranno una ORDER BY
concessione di memoria.
In Azure SQL Database, le visualizzazioni di gestione dinamica non possono esporre informazioni che potrebbero influire sul contenimento del database o esporre informazioni su altri database a cui l'utente può accedere. Per evitare di esporre queste informazioni, ogni riga che contiene dati che non appartengono al tenant connesso viene filtrata. Inoltre, i valori nelle colonne scheduler_id
, wait_order
, pool_id
, group_id
vengono filtrati. Il valore della colonna è impostato su NULL.
Nota
Per chiamare questa operazione da Azure Synapse Analytics o Analytics Platform System (PDW), usare il nome sys.dm_pdw_nodes_exec_query_memory_grants
. Questa sintassi non è supportata da pool SQL serverless in Azure Synapse Analytics.
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. Per una situazione tipica, questo valore deve essere uguale requested_memory_kb a . 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. requested_memory_kb è uguale o maggiore di 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 su cui la query è in attesa. Nota: Questo ID è univoco nelle versioni di SQL Server precedenti a SQL Server 2008 (10.0.x). La modifica può influire sulla risoluzione dei problemi relativi all'esecuzione di query. Per altre informazioni, vedere la sezione "Osservazioni" più avanti in questo articolo. |
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 dell'oggetto specificato queue_id . Questo valore può cambiare per una determinata query se altre query ottengono le concessioni di memoria o il timeout. NULL se la memoria è già 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. Usare sys.dm_exec_query_plan per estrarre il piano XML effettivo. |
sql_handle | varbinary(64) | Identificatore per il testo Transact-SQL per questa query. Usare 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à. |
pdw_node_id | int | Identificatore del nodo in cui si trova questa distribuzione. Si applica a: Azure Synapse Analytics, Analytics Platform System (PDW) |
reserved_worker_count | bigint | Numero di thread di lavoro riservati. Si applica a: SQL Server (a partire da SQL Server 2016 (13.x)) e Azure SQL database |
used_worker_count | bigint | Numero di thread di lavoro usati in questo momento. Si applica a: SQL Server (a partire da SQL Server 2016 (13.x)) e Azure SQL database |
max_used_worker_count | bigint | Numero massimo di thread di lavoro usati fino a questo momento. Si applica a: SQL Server (a partire da SQL Server 2016 (13.x)) e Azure SQL database |
reserved_node_bitmap | bigint | Bitmap dei nodi NUMA in cui i thread di lavoro sono riservati. Si applica a: SQL Server (a partire da SQL Server 2016 (13.x)) e Azure SQL database |
Autorizzazioni
In SQL Server è necessaria VIEW SERVER STATE
l'autorizzazione.
In Azure SQL database è necessaria l'autorizzazione VIEW DATABASE STATE
nel database.
Autorizzazioni per SQL Server 2022 e versioni successive
Richiede l'autorizzazione VIEW SERVER PERFORMANCE STATE nel server.
Commenti
Le query che usano viste di gestione dinamica che includono ORDER BY
o aggregazioni possono aumentare il consumo di memoria e quindi contribuire al problema che stanno risolvendo.
La funzionalità Resource Governor consente a un amministratore di database di distribuire risorse del server fra un massimo di 64 pool di risorse. A partire da SQL Server 2008 (10.0.x), ogni pool si comporta come un'istanza di server indipendente di piccole dimensioni e richiede due 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 (9,x).
Esempio
Uno scenario di debug tipico per il timeout delle query può analizzare quanto segue:
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 la presenza di prenotazioni di memoria in
sys.dm_os_memory_clerks
cuitype = 'MEMORYCLERK_SQLQERESERVATIONS'
.Verificare la presenza di query in attesadi 1 per le concessioni usando
sys.dm_exec_query_memory_grants
:--Find all queries waiting in the memory queue SELECT * FROM sys.dm_exec_query_memory_grants WHERE grant_time IS NULL;
1 In questo scenario il tipo di attesa è in genere RESOURCE_SEMAPHORE. Per altre informazioni, vedere sys.dm_os_wait_stats (Transact-SQL).
Cercare cache per le query con concessioni di memoria usando sys.dm_exec_cached_plans (Transact-SQL) e sys.dm_exec_query_plan (Transact-SQL)
-- retrieve every query plan from the plan cache USE master; GO SELECT * FROM sys.dm_exec_cached_plans cp CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle); GO
Se si sospetta una query runaway, esaminare Showplan nella
query_plan
colonna da sys.dm_exec_query_plan e eseguire query batchtext
da sys.dm_exec_sql_text. Esaminare ulteriormente le query a elevato utilizzo di memoria attualmente in esecuzione, usando sys.dm_exec_requests.--Active requests with memory grants SELECT --Session data s.[session_id], s.open_transaction_count --Memory usage , r.granted_query_memory, mg.grant_time, mg.requested_memory_kb, mg.granted_memory_kb, mg.required_memory_kb, mg.used_memory_kb, mg.max_used_memory_kb --Query , query_text = t.text, input_buffer = ib.event_info, query_plan_xml = qp.query_plan, request_row_count = r.row_count, session_row_count = s.row_count --Session history and status , s.last_request_start_time, s.last_request_end_time, s.reads, s.writes, s.logical_reads, session_status = s.[status], request_status = r.status --Session connection information , s.host_name, s.program_name, s.login_name, s.client_interface_name, s.is_user_process FROM sys.dm_exec_sessions s LEFT OUTER JOIN sys.dm_exec_requests AS r ON r.[session_id] = s.[session_id] LEFT OUTER JOIN sys.dm_exec_query_memory_grants AS mg ON mg.[session_id] = s.[session_id] OUTER APPLY sys.dm_exec_sql_text (r.[sql_handle]) AS t OUTER APPLY sys.dm_exec_input_buffer(s.[session_id], NULL) AS ib OUTER APPLY sys.dm_exec_query_plan (r.[plan_handle]) AS qp WHERE mg.granted_memory_kb > 0 ORDER BY mg.granted_memory_kb desc, mg.requested_memory_kb desc; GO
Vedi anche
- sys.dm_exec_query_resource_semaphores (Transact-SQL)
- sys.dm_os_wait_stats (Transact-SQL)
- Funzioni e viste a gestione dinamica relative all'esecuzione (Transact-SQL)
- Guida sull'architettura dei thread e delle attività
- MSSQLSERVER_701
- Risolvere i problemi relativi a errori di memoria insufficiente con il database SQL di Azure