Aracılığıyla paylaş


sys.dm_exec_query_memory_grants (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiAzure Synapse AnalyticsAnalytics Platform Sistemi (PDW)Microsoft Fabric SQL veritabanı

Hafıza hibsi talep eden ve bekleyen ya da hafıza hibsi alan tüm sorgular hakkında bilgi döndürür. Bellek desteği gerektirmeyen sorgular bu görünümde görünmez. Örneğin, sıralama ve hash birleştirme işlemlerinde sorgu çalıştırma için bellek hakkı verilirken, cümle ORDER BY olmayan sorgularda bellek bağışları olmaz.

Azure SQL Veritabanı'nda dinamik yönetim görünümleri, veritabanının kapsamasını etkileyecek bilgileri veya kullanıcının erişimi olan diğer veritabanları hakkındaki bilgileri kullanıma sunmaz. Bu bilgiyi açığa çıkarmamak için, bağlı kiracına ait olmayan veri içeren her satır filtrelenir. Ayrıca, sütunlardaki scheduler_iddeğerler , wait_order, pool_id, group_id filtrelenir; sütun değeri NULL olarak ayarlanır.

Uyarı

Bunu Azure Synapse Analytics veya Analytics Platform Sistemi'nden (PDW) çağırmak için adını sys.dm_pdw_nodes_exec_query_memory_grantskullanın. Bu söz dizimi, Azure Synapse Analytics'teki sunucusuz SQL havuzu tarafından desteklenmez.

Sütun adı Veri türü Açıklama
session_id smallint Bu sorgu çalıştığı oturumun kimliği (SPID) olarak kullanılır.
request_id int İsteğin tanımlayıcısı. Oturum bağlamında benzersiz.
scheduler_id int Bu sorguyu zamanlayan zamanlayıcının kimliği.
Dop smallint Bu sorgunun paralellik derecesi.
request_time datetime Bu sorgu hafıza izni talep ettiği tarih ve saat.
grant_time datetime Bu sorgu için hafızanın verildiği tarih ve saat. Henüz bellek verilmediyse NULL.
requested_memory_kb bigint İstenen toplam bellek miktarı kilobayt cinsinden.
granted_memory_kb bigint Verilen toplam bellek miktarı kilobayt cinsinden. Bellek henüz verilmediyse NULL olabilir. Tipik bir durumda bu değer ile requested_memory_kbaynı olmalıdır. Indeks oluşturma için, sunucu başlangıçta verilen belleğin ötesinde ek talep üzerine bellek izin verebilir.
required_memory_kb bigint Bu sorguyu çalıştırmak için gereken minimum bellek kilobayt cinsinden. requested_memory_kb bu miktardan aynı veya daha büyük.
used_memory_kb bigint Şu anda kullanılan fiziksel hafıza kilobaytlar cinsinden.
max_used_memory_kb bigint Bu ana kadar kullanılan maksimum fiziksel hafıza kilobayt cinsinden.
query_cost float Tahmini sorgu maliyeti.
timeout_sec int Bu sorgu bellek izin talebini vermeden önce saniyeler içinde zaman aşımı.
resource_semaphore_id smallint Bu sorguyu beklediği kaynak semaforunun benzersiz olmayan kimliği.

Not: Bu ID, SQL Server 2008'den (10.0.x) önceki SQL Server sürümlerinde benzersizdir. Bu değişiklik, sorun giderme sorgusu yürütülmesini etkileyebilir. Daha fazla bilgi için bu makalenin ilerleyen bölümlerinde "Açıklamalar" bölümüne bakınız.
queue_id smallint Bu sorgu bellek izlerini beklediği bekleme kuyruğunun kimliği. Eğer bellek zaten verilmişse, NULL olabilir.
wait_order int Belirtilen queue_idsorgu içinde bekleme sorgularının ardışık sırası . Bu değer, diğer sorgular bellek bağışları veya zaman aşımı alırsa belirli bir sorgu için değişebilir. Bellek zaten verilmişse NULL.
is_next_candidate bit Bir sonraki anı bursu için aday.

1 = Evet

0 = Hayır

NULL = Bellek zaten verilmiştir.
wait_time_ms bigint Bekleme süresi milisaniyelerde. Eğer bellek zaten verilmişse, NULL olabilir.
plan_handle varbinary(64) Bu sorgu planı için tanımlayıcı. Gerçek XML planını çıkarmak için kullanılır sys.dm_exec_query_plan .
sql_handle varbinary(64) Bu sorgu için Transact-SQL metin tanımlayıcısı. Eskiden sys.dm_exec_sql_text gerçek Transact-SQL metni almak için kullanılırdı.
group_id int Bu sorgu çalıştığı iş yükü grubunun kimliği.
pool_id int Bu iş yükü grubunun ait olduğu kaynak havuzunun ID'si.
is_small tinyint 1 olarak ayarlandığında, bu hibe küçük kaynak semaforunu kullandığını gösterir. 0 olarak ayarlandığında, düzenli bir semafor kullanıldığını gösterir.
ideal_memory_kb bigint Her şeyi fiziksel belleğe sığdırmak için bellek veriminin kilobayt cinsinden (KB) boyutu. Bu, kardinalite tahminine dayanır.
pdw_node_id int Bu dağıtımın üzerinde olduğu düğümün tanımlayıcısı.

için geçerlidir: Azure Synapse Analytics, Analiz Platformu Sistemi (PDW)
reserved_worker_count bigint Rezerve edilen işçi ipliklerinin sayısı.

Şunlara uygulanır: SQL Server (SQL Server 2016 (13.x)'dan başlayarak) ve Azure SQL Database
used_worker_count bigint Şu anda kullanılan işçi ipliklerinin sayısı.

Şunlara uygulanır: SQL Server (SQL Server 2016 (13.x)'dan başlayarak) ve Azure SQL Database
max_used_worker_count bigint Bugüne kadar kullanılan maksimum işçi iş parçacığı .

Şunlara uygulanır: SQL Server (SQL Server 2016 (13.x)'dan başlayarak) ve Azure SQL Database
reserved_node_bitmap bigint İşçi iş parçacıklarının ayrıldığı NUMA düğümlerinin bitmap haritası.

Şunlara uygulanır: SQL Server (SQL Server 2016 (13.x)'dan başlayarak) ve Azure SQL Database

Permissions

SQL Server'da ise izin gerekiyor VIEW SERVER STATE .
Azure SQL Veritabanı için, veritabanında izin gerektirir VIEW DATABASE STATE .

SQL Server 2022 ve üzeri için izinler

Sunucuda SUNUCU PERFORMANS DURUMUNU GÖRÜNTÜLE izni gerektirir.

Açıklamalar

Dinamik yönetim görünümlerini içeren veya ORDER BY toplayan sorgular, bellek tüketimini artırabilir ve böylece sorun gidermeye katkıda bulunabilir.

Resource Governor özelliği, veritabanı yöneticisinin sunucu kaynaklarını en fazla 64 havuza kadar kaynak havuzları arasında dağıtmasını sağlar. SQL Server 2008 (10.0.x) ile itibaren, her havuz küçük bağımsız bir sunucu örneği gibi davranır ve iki semafor gerektirir. Geri sys.dm_exec_query_resource_semaphores dönen satır sayısı, SQL Server 2005'te (9.x) döndürülen satırlardan 20 katına kadar fazla olabilir.

Örnekler

Sorgu zamanlatımı için tipik bir hata ayıklama senaryosu aşağıdakileri inceleyebilir:

  • Genel sistem bellek durumunu sys.dm_os_memory_clerks, sys.dm_os_sys_info ve çeşitli performans sayacları kullanarak kontrol edin.

  • Sorgu yürütme belleği rezervasyonlarını kontrol sys.dm_os_memory_clerks edin, burada type = 'MEMORYCLERK_SQLQERESERVATIONS'.

  • Hibeiçin 1 bekleyen soruları şu adresle sys.dm_exec_query_memory_grantskontrol edin:

    --Find all queries waiting in the memory queue  
    SELECT * FROM sys.dm_exec_query_memory_grants WHERE grant_time IS NULL;
    

    1 Bu senaryoda, bekleme türü genellikle RESOURCE_SEMAPHORE. Daha fazla bilgi için bkz. sys.dm_os_wait_stats (Transact-SQL).

  • Bellek izleri olan sorguları sys.dm_exec_cached_plans (Transact-SQL) ve sys.dm_exec_query_plan (Transact-SQL) kullanarak önbellekte arama

    -- 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  
    
  • Eğer bir kaçış sorgusu şüphesi varsa, sys.dm_exec_query_plan sütunundaki Showplan'ı query_plan ve sys.dm_exec_sql_text'den sorgu partisini text inceleyin. Şu anda yürütülen bellek yoğun sorguları sys.dm_exec_requests kullanarak daha fazla inceleyin.

    --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
    

Ayrıca bakınız