RESOURCE_SEMAPHORE ve RESOURCE_SEMAPHORE_QUERY_COMPILE bekleme türleri nasıl çözülür?


13

Aşağıdaki yapılandırma ile sunucuda barındırılan, 300 GB boyutunda bir veritabanından veri isabet / getirme yavaş çalışan sql sunucu sorgularının temel nedenini anlamaya çalışıyoruz:

Windows Server 2003 R2, SP2, Enterprise Edition, 16 GB RAM, 12 CPU 32 Bit

SQL Server 2005, SP4, Enterprise Edition, 32 Bit.

Bir aydan uzun sürecek olan 64 bit'e yükseltme konusunda işi zaten bilgilendirdik.

Ancak mevcut sorun için, bellek basıncını çözebilir veya sonunda RAM'i artırmak için bir sonuca varabilirsek verileri toplamaya çalışıyoruz.

Eylem Tamamlandı: Yeniden dizin oluşturma ve güncelleme istatistikleri bu DB için uygundur.

Aşağıda gösterildiği gibi, yükleme saatlerinde geçen 5 gündür semafor bekleme tipini fark ettik:

waittype

Aşağıdaki sorgulardan sonra birkaç bilgi: arabellek boyutu = 137272

SELECT SUM(virtual_memory_committed_kb)
FROM sys.dm_os_memory_clerks
WHERE type='MEMORYCLERK_SQLBUFFERPOOL'

ve semafor belleği = aşağıdaki sorgu başına 644024

 SELECT SUM(total_memory_kb)
FROM sys.dm_exec_query_resource_semaphores

Aşağıda daha fazla bilgi dm_exec_query_resource_semaphoresve sys.dm_exec_query_memory_grantsdmv

dmvserror

Yani yukarıdaki bilgilerden toplanan ve SP_Blitz verileri başına Kaynak semaforu sorun gibi görünüyor.

Kaynak semafor kimlikleri için kullanılabilir 'hedef_memory_kb' belleği 16 GB RAM ile karşılaştırıldığında çok düşük mü?

Not * 8 saatlik çalıştırmada analiz başına 'target_memory_kb' her zaman 1 GB'ın altında, 16 GB kullanılabilir mi?

burada sorun ne olabilir ve nasıl çözüleceğini lütfen önerin

Teşekkürler


Yorumlar uzun tartışmalar için değildir; bu görüşme sohbete taşındı . Konu dışı diğer yorumlar da silinecektir.
Paul White 9

Yanıtlar:


25

Aman tanrım, burada kötü haberlerim var.

32-bit işletim sisteminde, SQL Server sorgu çalışma alanı gibi şeyler için yalnızca ilk 4 GB belleği kullanır. (Ve bu 4GB için işletim sistemi ile mücadele ediyor - çalışan diğer uygulamalar da bu bellek için rekabet edecek.)

4GB çok ses gibi gelebilir, ancak çalıştırmak için birkaç GB belleğe ihtiyaç duyan bir sorgu yazmak nispeten kolaydır. Yeterli sorgu yeterli bellek gerektirdiğinde, sorgular başlamak için yeterli bellek alamadığından SQL Server RESOURCE_SEMAPHORE bekler. RESOURCE_SEMAPHORE_QUERY_COMPILE, bir yürütme planını derlemek için yeterli belleğe bile sahip olamayacakları anlamına geliyor - ve evet, bu oldukça kötü.

Peki nasıl düzeltirsiniz?

  • 64 bit işletim sistemine geçin (çalıştırdığınız işletim sistemi zaten destek dışıdır)
  • SQL Server'ın 64 bitlik bir sürümüne geçme
  • Sunucudaki bellek taleplerini azaltın (bu kutuda başka bir uygulama çalıştırmayın ve bu sadece 4GB ile sınırlandığımız için 32 bit kutularda özellikle kritiktir)
  • AWE / PAE anahtarlarıyla daha fazla bellek kullanın - bunun dışında RESOURCE_SEMAPHORE beklemede çalışmaz, çünkü SQL Server yalnızca bu ilk 4GB'yi sorgu çalışma alanı için kullanabilir
  • Daha az belleğe ihtiyaç duymaları için sorguları ve dizinleri ayarlama

32-bit sorunu çok kötü olduğu ve SQL Server'ın eski sürümlerinde gerçekten zor olduğu için sonuncuyu bile söylemekten çekinmeyin. Mevcut bir programdaysanız, plan önbelleğinden geçebilir ve sorguları bellek hibesine göre sıralayabilir, en büyük hibe alıcılarını bulabilir ve bunları ayarlayabilirsiniz. Ancak bu eski antika üzerinde bir seçenek değil.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.