Cara mengatasi RESOURCE_SEMAPHORE dan RESOURCE_SEMAPHORE_QUERY_COMPILE jenis tunggu

13

Kami mencoba mencari tahu akar penyebab lambatnya kueri server sql mengenai / mengambil data dari salah satu database, ukuran 300 GB, di-host di server dengan konfigurasi di bawah ini:

Server Windows 2003 R2, SP2, Edisi Perusahaan, 16 GB RAM, 12 CPU 32 Bit

SQL server 2005, SP4, Edisi Perusahaan, 32 Bit.

Kami telah memberi tahu bisnis tentang peningkatan ke 64 bit yang akan memakan waktu lebih dari sebulan.

Tetapi untuk masalah saat ini, kami mencoba untuk mengumpulkan data jika kami dapat menyelesaikan tekanan memori atau akhirnya mencapai kesimpulan untuk meningkatkan RAM.

Tindakan Selesai: Mengindeks ulang dan memperbarui statistik sesuai untuk DB ini.

Seperti yang ditunjukkan di bawah ini, kami telah memperhatikan waittype semaphore selama 5 hari terakhir, dijalankan selama jam buka:

waittype

Beberapa info setelah kueri di bawah ini: ukuran buffer = 137272

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

dan memori semaphore = 644024 per kueri di bawah ini

 SELECT SUM(total_memory_kb)
FROM sys.dm_exec_query_resource_semaphores

Di bawah ini adalah beberapa info yang dikumpulkan dm_exec_query_resource_semaphoresdan sys.dm_exec_query_memory_grantsdmv

dmvserror

Jadi dari info di atas yang dikumpulkan dan per SP_Blitz data Resource semaphore tampaknya menjadi masalah.

Apakah memori 'target_memory_kb' ditetapkan untuk id sumber daya semaphore terlalu rendah, dibandingkan dengan 16 GB RAM yang tersedia.

Catatan * per analisis pada 8 jam menjalankan 'target_memory_kb' selalu di bawah 1 GB, dibandingkan dengan 16 GB yang tersedia?

apa yang bisa menjadi masalah di sini dan bagaimana cara mengatasinya, silakan sarankan

Terima kasih

KASQLDBA
sumber
Komentar bukan untuk diskusi panjang; percakapan ini telah dipindahkan ke obrolan . Komentar di luar topik selanjutnya hanya akan dihapus.
Paul White 9

Jawaban:

25

Ya ampun, aku punya berita buruk di sini.

Pada OS 32-bit, SQL Server hanya menggunakan memori 4GB pertama untuk hal-hal seperti ruang kerja kueri. (Dan itu juga melawan OS untuk 4GB itu - aplikasi yang berjalan lainnya juga akan bersaing untuk memori itu.)

4GB mungkin terdengar sangat banyak, tetapi relatif mudah untuk menulis permintaan yang membutuhkan beberapa GB memori untuk dapat berjalan. Ketika permintaan yang cukup menuntut memori yang cukup, SQL Server melempar RESOURCE_SEMAPHORE menunggu karena permintaan tidak bisa mendapatkan cukup memori untuk memulai. RESOURCE_SEMAPHORE_QUERY_COMPILE berarti mereka bahkan tidak bisa mendapatkan cukup memori untuk menyusun rencana eksekusi - dan ya, itu sangat buruk.

Jadi bagaimana Anda memperbaikinya?

  • Beralihlah ke OS 64-bit (OS yang Anda jalankan sudah lama tidak didukung)
  • Beralih ke build SQL Server 64-bit
  • Kurangi permintaan memori di server (jangan jalankan aplikasi lain di kotak ini, dan itu sangat penting pada kotak 32-bit karena kami dibatasi hanya 4GB)
  • Gunakan lebih banyak memori dengan sakelar AWE / PAE - kecuali itu tidak bekerja untuk RESOURCE_SEMAPHORE menunggu karena SQL Server hanya dapat menggunakan 4GB pertama untuk ruang kerja kueri
  • Menyetel kueri & indeks sehingga mereka membutuhkan lebih sedikit memori

Saya ragu untuk mengatakan yang terakhir, karena masalah 32-bit sangat buruk, dan sangat sulit pada versi SQL Server yang lebih lama. Jika Anda menggunakan yang saat ini, Anda bisa pergi melalui cache rencana dan mengurutkan permintaan berdasarkan memori, menemukan penerima hibah terbesar, dan menyetel mereka. Bukan pilihan untuk barang antik tua ini.

Brent Ozar
sumber