Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir:Azure SQL Database
Fabric'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
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_reportedexchange_spillhash_spill_details
Kategori Yürütme:
excessive_non_grant_memory_used
Kategori Belleği:
query_memory_grant_blockingquery_memory_grant_usage
summarized_oom_snapshotBellek 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_snapshotolay, algılamayı basitleştirmek için mevcutsystem_healtholay 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.
İlgili içerik
- SQL veritabanlarında akıllı sorgu işleme
- Sorgu işleme mimarisi kılavuzu
- SQL Server Veri Tabanı Motoru ve Azure SQL Veri Tabanı Performans Merkezi için
Azure SQL Database ve Azure SQL Managed Instance - SQL Veritabanı ve SQL Yönetilen Örneği'nde geçici bağlantı sorunlarını giderme
- İşlem günlüğü hatalarını giderme
- Akıllı Sorgu İşlemeyi Gösterme
- Azure SQL Database'de Kaynak Yönetimi
- Blog: Veritabanı altyapısındaki yetersiz bellek hatalarını gidermenin yeni bir yolu