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:
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_semaphores
dan sys.dm_exec_query_memory_grants
dmv
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
sumber
Jawaban:
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?
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.
sumber