sys.dm_exec_query_memory_grants (T-SQL)
Berlaku untuk: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)
Mengembalikan informasi tentang semua kueri yang telah diminta dan sedang menunggu pemberian memori atau telah diberi peruntukan memori. Kueri yang tidak memerlukan peruntukan memori tidak akan muncul dalam tampilan ini. Misalnya, operasi pengurutan dan gabungan hash memiliki hibah memori untuk eksekusi kueri, sementara kueri tanpa ORDER BY
klausul tidak akan memiliki peruntukan memori.
Di Azure SQL Database, tampilan manajemen dinamis tidak dapat mengekspos informasi yang akan memengaruhi penahanan database atau mengekspos informasi tentang database lain yang dapat diakses pengguna. Untuk menghindari mengekspos informasi ini, setiap baris yang berisi data yang bukan milik penyewa yang tersambung difilter. Selain itu, nilai dalam kolom scheduler_id
, , wait_order
pool_id
, group_id
difilter; nilai kolom diatur ke NULL.
Catatan
Untuk memanggil ini dari Azure Synapse Analytics atau Analytics Platform System (PDW), gunakan nama sys.dm_pdw_nodes_exec_query_memory_grants
. Sintaks ini tidak didukung oleh kumpulan SQL tanpa server di Azure Synapse Analytics.
Nama kolom | Jenis data | Keterangan |
---|---|---|
session_id | smallint | ID (SPID) sesi tempat kueri ini berjalan. |
request_id | int | ID permintaan. Unik dalam konteks sesi. |
scheduler_id | int | ID penjadwal yang menjadwalkan kueri ini. |
Dop | smallint | Tingkat paralelisme kueri ini. |
request_time | datetime | Tanggal dan waktu saat kueri ini meminta pemberian memori. |
grant_time | datetime | Tanggal dan waktu ketika memori diberikan untuk kueri ini. NULL jika memori belum diberikan. |
requested_memory_kb | bigint | Total jumlah memori yang diminta dalam kilobyte. |
granted_memory_kb | bigint | Jumlah total memori yang sebenarnya diberikan dalam kilobyte. Dapat berupa NULL jika memori belum diberikan. Untuk situasi umum, nilai ini harus sama dengan requested_memory_kb . Untuk pembuatan indeks, server dapat mengizinkan memori sesuai permintaan tambahan di luar memori yang awalnya diberikan. |
required_memory_kb | bigint | Memori minimum yang diperlukan untuk menjalankan kueri ini dalam kilobyte. requested_memory_kb sama atau lebih besar dari jumlah ini. |
used_memory_kb | bigint | Memori fisik yang digunakan saat ini dalam kilobyte. |
max_used_memory_kb | bigint | Memori fisik maksimum yang digunakan hingga saat ini dalam kilobyte. |
query_cost | float | Estimasi biaya kueri. |
timeout_sec | int | Waktu habis dalam detik sebelum kueri ini menyerahkan permintaan pemberian memori. |
resource_semaphore_id | smallint | ID tidak unik dari semaphore sumber daya tempat kueri ini menunggu. Catatan: ID ini unik dalam versi SQL Server yang lebih lama dari SQL Server 2008 (10.0.x). Perubahan ini dapat memengaruhi pemecahan masalah eksekusi kueri. Untuk informasi selengkapnya, lihat bagian "Komentar" nanti di artikel ini. |
queue_id | smallint | ID antrean menunggu di mana kueri ini menunggu peruntukan memori. NULL jika memori sudah diberikan. |
wait_order | int | Urutan berurutan kueri tunggu dalam yang ditentukan queue_id . Nilai ini dapat berubah untuk kueri tertentu jika kueri lain mendapatkan peruntukan memori atau waktu habis. NULL jika memori sudah diberikan. |
is_next_candidate | bit | Kandidat untuk pemberian memori berikutnya. 1 = Ya 0 = Tidak NULL = Memori sudah diberikan. |
wait_time_ms | bigint | Waktu tunggu dalam milidetik. NULL jika memori sudah diberikan. |
plan_handle | varbinary(64) | Pengidentifikasi untuk rencana kueri ini. Gunakan sys.dm_exec_query_plan untuk mengekstrak paket XML yang sebenarnya. |
sql_handle | varbinary(64) | Pengidentifikasi untuk teks Transact-SQL untuk kueri ini. Gunakan sys.dm_exec_sql_text untuk mendapatkan teks Transact-SQL yang sebenarnya. |
group_id | int | ID untuk grup beban kerja tempat kueri ini berjalan. |
pool_id | int | ID kumpulan sumber daya tempat grup beban kerja ini berada. |
is_small | kecil | Ketika diatur ke 1, menunjukkan bahwa pemberian ini menggunakan semaphore sumber daya kecil. Ketika diatur ke 0, menunjukkan bahwa semaphore biasa digunakan. |
ideal_memory_kb | bigint | Ukuran, dalam kilobyte (KB), dari pemberian memori agar sesuai dengan semuanya ke dalam memori fisik. Ini didasarkan pada perkiraan kardinalitas. |
pdw_node_id | int | Pengidentifikasi untuk simpul tempat distribusi ini aktif. Berlaku untuk: Azure Synapse Analytics, Analytics Platform System (PDW) |
reserved_worker_count | bigint | Jumlah utas pekerja yang dipesan. Berlaku untuk: SQL Server (Dimulai dengan SQL Server 2016 (13.x)) dan Azure SQL Database |
used_worker_count | bigint | Jumlah utas pekerja yang digunakan saat ini. Berlaku untuk: SQL Server (Dimulai dengan SQL Server 2016 (13.x)) dan Azure SQL Database |
max_used_worker_count | bigint | Jumlah maksimum utas pekerja yang digunakan hingga saat ini. Berlaku untuk: SQL Server (Dimulai dengan SQL Server 2016 (13.x)) dan Azure SQL Database |
reserved_node_bitmap | bigint | Bitmap simpul NUMA tempat utas pekerja dicadangkan. Berlaku untuk: SQL Server (Dimulai dengan SQL Server 2016 (13.x)) dan Azure SQL Database |
Izin
Di SQL Server, memerlukan VIEW SERVER STATE
izin.
Di Azure SQL Database, memerlukan VIEW DATABASE STATE
izin dalam database.
Izin untuk SQL Server 2022 dan yang lebih baru
Memerlukan izin TAMPILKAN STATUS PERFORMA SERVER pada server.
Keterangan
Kueri yang menggunakan tampilan manajemen dinamis yang menyertakan ORDER BY
atau mengagregasi dapat meningkatkan konsumsi memori dan dengan demikian berkontribusi pada masalah pemecahan masalahnya.
Fitur Resource Governor memungkinkan administrator database untuk mendistribusikan sumber daya server di antara kumpulan sumber daya, hingga maksimum 64 kumpulan. Dimulai dengan SQL Server 2008 (10.0.x), setiap kumpulan bereaksi seperti instans server independen kecil dan memerlukan dua semaphores. Jumlah baris yang dikembalikan dari bisa hingga 20 kali lebih banyak dari sys.dm_exec_query_resource_semaphores
baris yang dikembalikan di SQL Server 2005 (9.x).
Contoh
Skenario penelusuran kesalahan umum untuk batas waktu kueri dapat menyelidiki hal berikut:
Periksa status memori sistem secara keseluruhan menggunakan sys.dm_os_memory_clerks, sys.dm_os_sys_info, dan berbagai penghitung kinerja.
Periksa reservasi memori eksekusi kueri di
sys.dm_os_memory_clerks
manatype = 'MEMORYCLERK_SQLQERESERVATIONS'
.Periksa kueri yang menunggu1 untuk pemberian menggunakan
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 Dalam skenario ini, jenis tunggu biasanya RESOURCE_SEMAPHORE. Untuk informasi selengkapnya, lihat sys.dm_os_wait_stats (Transact-SQL).
Cari cache untuk kueri dengan pemberian memori menggunakan sys.dm_exec_cached_plans (Transact-SQL) dan 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
Jika kueri pelarian dicurigai, periksa Showplan di
query_plan
kolom dari sys.dm_exec_query_plan dan batchtext
kueri dari sys.dm_exec_sql_text. Periksa lebih lanjut kueri intensif memori yang saat ini dijalankan, menggunakan 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