Aracılığıyla paylaş


Azure SQL Database ve Fabric SQL veritabanıyla ilgili yetersiz bellek hatalarını giderme

Şunlar için geçerlidir:Azure SQL DatabaseFabric'teki SQL veritabanı

SQL veritabanı altyapısı sorguyu çalıştırmak için yeterli bellek ayıramadığında hata iletileri görebilirsiniz. Bu hatalar seçilen hizmet hedefinin sınırları, toplu iş yükü bellek talepleri ve sorgu bellek talepleri gibi birçok farklı nedenden kaynaklanabilir.

Azure SQL Database bellek kaynağı sınırı hakkında daha fazla bilgi için bkz. Azure SQL Database'da Kaynak yönetimi. Fabric SQL veritabanı, Azure SQL Database ile birçok özelliği paylaşır. Performans izleme hakkında daha fazla bilgi için bkz. Fabric SQL database performance monitoring.

SQL Server'da yetersiz bellek sorunlarını giderme hakkında daha fazla bilgi için bkz. MSSQLSERVER_701.

Yanıt olarak aşağıdaki araştırma yollarını deneyin:

  • "'%ls' kaynak havuzunda bu sorguyu çalıştırmak için yetersiz sistem belleği var" hata iletisiyle 701 hata kodu.
  • Hata kodu 802 "Arabellek havuzunda kullanılabilir bellek yetersiz." hata iletisiyle birlikte.

Bellek dışı olayları görüntüleme

Yetersiz bellek hatalarıyla karşılaşırsanız sys.dm_os_out_of_memory_events öğesini gözden geçirin. Bu görünüm, sezgisel bir algoritma tarafından belirlenen ve belirli bir güven derecesiyle sağlanan, tahmin edilen yetersiz bellek nedeni hakkında bilgi içerir.

SELECT * FROM sys.dm_os_out_of_memory_events ORDER BY event_time DESC;  

Bellek ayırmayı araştırın

Bellek yetersizliği hataları Azure SQL Database'de devam ederse, Azure portalında veritabanının hizmet düzeyi hedefini en azından geçici olarak artırmayı göz önünde bulundurun.

Yetersiz bellek hataları devam ederse, yetersiz bellek koşuluna katkıda bulunabilecek olağan dışı yüksek sorgu belleği izinlerini aramak için aşağıdaki sorguları kullanın. Hatayla karşılaşan veritabanında aşağıdaki örnek sorguları çalıştırın (Azure SQL mantıksal sunucunun master veritabanında değil).

Bellek yetersizliği olaylarını görüntülemek için DMV kullanın

Azure SQL Veritabanı'ndaki bellek yetersizliği (OOM) olaylarının sebeplerine ve bu olaylara dair görünürlük sağlar. Genişletilmiş summarized_oom_snapshot olay, algılamayı basitleştirmek için mevcut system_health olay oturumunun bir parçasıdır. Daha fazla bilgi için bkz . sys.dm_os_out_of_memory_events ve Blog: Veritabanı altyapısındaki yetersiz bellek hatalarını gidermenin yeni bir yolu.

Bellek katiplerini görüntülemek için DMV'leri kullanma

Bellek yetersiz hatasının yakın zamanda oluşup oluşmadığını araştırmak için, bellek tahsisatlarını bellek katipleri için inceleyerek kapsamlı bir araştırmaya başlayın. Bellek katipleri bu Azure SQL Database için veritabanı altyapısının iç birimidir. SQL Server'da en çok bellek tüketen sorgu veya özelliğin türü hakkında en çok bilgi verebilecek olanlar, ayrılan sayfalar açısından en fazla kullanılan bellek sorumluları olabilir.

SELECT [type], [name], pages_kb, virtual_memory_committed_kb
FROM sys.dm_os_memory_clerks
WHERE memory_node_id <> 64 -- ignore Dedicated Admin Connection (DAC) node
ORDER BY pages_kb DESC;
GO
SELECT [type], [name], pages_kb, virtual_memory_committed_kb
FROM sys.dm_os_memory_clerks
WHERE memory_node_id <> 64 -- ignore Dedicated Admin Connection (DAC) node
ORDER BY virtual_memory_committed_kb DESC;
  • MEMORYCLERK_SQLQERESERVATIONS gibi bazı yaygın bellek katipleri en iyi şekilde büyük bellek izinleri olan sorguları tanımlayarak ve daha iyi dizin oluşturma ve dizin ayarlama ile performanslarını geliştirerek çözümlenir.
  • OBJECTSTORE_LOCK_MANAGER bellek atamalarıyla ilgisi olmasa da, sorgular çok sayıda kilit talep ettiğinde( örneğin devre dışı bırakılmış kilit yükseltmesi veya çok büyük işlemler nedeniyle) yüksek olması beklenir.
  • Bazı katiplerin en yüksek kullanımda olması beklenir: MEMORYCLERK_SQLBUFFERPOOL neredeyse her zaman en üst katip olurken, columnstore dizinleri kullanıldığında CACHESTORE_COLUMNSTOREOBJECTPOOL yüksek olacaktır. Bu memurların en yüksek düzeyde kullanım gerçekleştirmesi bekleniyor.

Bellek katibi türleri hakkında daha fazla bilgi için bkz . sys.dm_os_memory_clerks.

Aktif sorguları araştırmak için DMV'leri kullanma

Çoğu durumda, başarısız olan sorgu bu hatanın nedeni değildir.

Azure SQL Database için aşağıdaki örnek sorgu, şu anda bellek atamalarını tutan veya bekleyen işlemler hakkında önemli bilgiler döndürür. İnceleme ve performans ayarlaması için tanımlanan en önemli sorguları hedefleyin ve istendiği gibi yürütülüyor olup olmadığını değerlendirin. Yoğun bellek kullanan raporlama sorgularının veya bakım işlemlerinin zamanlamasını göz önünde bulundurun.

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

Şu anda büyük bir bellek iznini tutan veya bekleyen bir sorguyu durdurmak için KILL deyimini kullanmaya karar verebilirsiniz. Özellikle kritik işlemler çalışırken bu deyimi dikkatle kullanın. Daha fazla bilgi için bkz. KILL (Transact-SQL).

Geçmiş sorgu belleği kullanımını araştırmak için Query Store kullanma

Önceki örnek sorgu yalnızca canlı sorgu sonuçlarını raporlasa da, aşağıdaki sorgu geçmiş sorgu yürütme hakkında bilgi döndürmek için Query Store kullanır. Bu, geçmişte oluşan bellek yetersiz hatasının araştırılmasında yararlı olabilir.

Azure SQL Database için aşağıdaki örnek sorgu, Query Store tarafından kaydedilen sorgu yürütmeleriyle ilgili önemli bilgileri döndürür. İnceleme ve performans ayarlaması için tanımlanan en önemli sorguları hedefleyin ve istendiği gibi yürütülüyor olup olmadığını değerlendirin. Sonuçları yakın geçmişle sınırlamak için zaman filtresinin açık qsp.last_execution_time olduğunu unutmayın. TOP yan tümcesini ortamınıza bağlı olarak daha fazla veya daha az sonuç üretecek şekilde ayarlayabilirsiniz.

SELECT TOP 10 PERCENT --limit results
  a.plan_id, query_id, plan_group_id, query_sql_text
, query_plan = TRY_CAST(query_plan as XML)
, avg_query_max_used_memory
, min_query_max_used_memory
, max_query_max_used_memory
, last_query_max_used_memory 
, last_execution_time  
, query_count_executions
    FROM (
    SELECT 
      qsp.plan_id, qsp.query_id, qsp.plan_group_id, qsp.query_plan, qsqt.query_sql_text
    , last_execution_time = MAX(qsp.last_execution_time)
    , query_count_executions = SUM(qsrs.count_executions) 
    , avg_query_max_used_memory = AVG(qsrs.avg_query_max_used_memory)
    , min_query_max_used_memory = MIN(qsrs.min_query_max_used_memory)
    , max_query_max_used_memory = MAX(qsrs.max_query_max_used_memory)
    , last_query_max_used_memory = MAX(qsrs_latest.last_query_max_used_memory) --only from latest result
    FROM sys.query_store_plan AS qsp 
    INNER JOIN sys.query_store_query AS qsq
        ON qsp.query_id = qsq.query_id
    INNER JOIN sys.query_store_query_text AS qsqt
        ON qsq.query_text_id = qsqt.query_text_id 
    INNER JOIN sys.query_store_runtime_stats AS qsrs
        ON qsp.plan_id = qsrs.plan_id 
    INNER JOIN (SELECT plan_id
            , last_query_max_used_memory 
            , rownum = ROW_NUMBER() OVER (PARTITION BY plan_id ORDER BY last_execution_time DESC)
            FROM sys.query_store_runtime_stats qsrs) AS qsrs_latest
        ON qsrs_latest.plan_id = qsp.plan_id
        AND qsrs_latest.rownum = 1 --use latest last_query_max_used_memory per plan_id
    WHERE DATEADD(hour, -24, sysdatetime()) < qsp.last_execution_time --past 24 hours only
    AND qsrs_latest.last_query_max_used_memory > 0
    GROUP BY qsp.plan_id, qsp.query_id, qsp.plan_group_id, qsp.query_plan, qsqt.query_sql_text
    ) AS a
ORDER BY max_query_max_used_memory DESC, avg_query_max_used_memory DESC;

Genişletilmiş olaylar

Önceki bilgilere ek olarak, Azure SQL Database bellek yetersiz sorununu ayrıntılı olarak araştırmak için sunucudaki etkinliklerin bir izlemesini yakalamak yararlı olabilir.

SQL Server'da izlemeleri yakalamanın iki yolu vardır; Genişletilmiş Olaylar (XEvents) ve Profil Oluşturucu İzlemeleri. Ancak SQL Server Profiler Azure SQL Database için desteklenmeyen izleme teknolojisi kullanım dışıdır. Extended Events gözlemlenen sisteme daha çok yönlülük ve daha az etki sağlayan yeni izleme teknolojisidir ve arabirimi SQL Server Management Studio (SSMS) ile tümleştirilir. Azure SQL Database'da genişletilmiş olayları sorgulama hakkında daha fazla bilgi için bkz. Azure SQL Database'de Genişletilmiş Olaylar.

SSMS'de Genişletilmiş Olaylar Yeni Oturum Sihirbazı'nın nasıl kullanılacağını açıklayan belgeye bakın. Ancak Azure SQL veritabanları için SSMS, Object Explorer içindeki her veritabanının altında bir Genişletilmiş Olaylar alt klasörü sağlar. Bu yararlı olayları yakalamak ve bunları oluşturan sorguları belirlemek için Genişletilmiş Olaylar oturumu kullanın:

  • Kategori Hataları:

    • error_reported
    • exchange_spill
    • hash_spill_details
  • Kategori Yürütme:

    • excessive_non_grant_memory_used
  • Kategori Belleği:

    • query_memory_grant_blocking
    • query_memory_grant_usage
  • summarized_oom_snapshot

    Bellek verme bloklarının, bellek atama taşmalarının veya aşırı bellek atamalarının yakalanması, sorgunun geçmişteki bellekten daha fazla bellek almasına ve mevcut bir iş yükünde ortaya çıkan bellek yetersiz hatasının olası açıklamasına yönelik olası bir ipucu olabilir. Genişletilmiş summarized_oom_snapshot olay, algılamayı basitleştirmek için mevcut system_health olay oturumunun bir parçasıdır. Daha fazla bilgi için bkz . Blog: Veritabanı altyapısındaki yetersiz bellek hatalarını gidermenin yeni bir yolu.

Bellek içi OLTP yetersiz bellek

Bellek içi OLTP kullanıyorsanız Error code 41805: There is insufficient memory in the resource pool '%ls' to run this operation ile karşılaşabilirsiniz. Bellek için iyileştirilmiş tablolardaki ve bellek için iyileştirilmiş tablo değerli parametrelerdeki veri miktarını azaltın veya daha fazla belleğe sahip olmak için veritabanını daha yüksek bir hizmet hedefine ölçeklendirin. SQL Server In-Memory OLTP ile ilgili bellek yetersiz sorunları hakkında daha fazla bilgi için bkz. Bellek Yetersiz Sorunlarını Çözme.

Azure SQL Database desteği alın

Bellek yetersizliği hataları Azure SQL Database'de devam ediyorsa, Get Support seçeneğini tıklayarak Azure Support sitesinde bir Azure destek isteği oluşturun.