Temukan basis data di SQL Server 2005 yang menggunakan berapa banyak RAM

12

Seorang teman saya bertanya kepada saya hari ini (mencoba untuk menenangkan pelanggannya yang gelisah) bagaimana Anda bisa mengetahui di SQL Server 2005 basis data mana yang menggunakan berapa banyak memori (dalam RAM server itu) pada waktu tertentu.

Apakah itu mungkin? Jika demikian - bagaimana? Bisakah Anda melakukan ini dengan alat SQL Server bawaan, atau apakah Anda memerlukan opsi pihak ketiga tambahan?

Pelanggannya semua bingung karena mesin SQL Server khusus nya tiba-tiba menggunakan semua kecuali 200KB dari 4 GB RAM-nya. Saya tidak berpikir ini masalah, sungguh - tetapi karena orang ini mengklaim itu terjadi kurang lebih dalam semalam, dia ingin tahu apa yang menyebabkan peningkatan penggunaan memori ini .....

Marc

marc_s
sumber

Jawaban:

25

Kemungkinan besar disebabkan oleh permintaan yang ingin membaca lebih banyak halaman ke dalam buffer pool, dan buffer pool mengambil lebih banyak memori untuk mengakomodasi hal itu. Beginilah seharusnya SQL Server bekerja. Jika kotak mengalami tekanan memori, ia akan meminta SQL Server untuk memberikan sebagian memori, yang akan dilakukan. Pelanggan tidak perlu khawatir.

Anda dapat menggunakan DMV sys.dm_os_buffer_descriptorsuntuk melihat berapa banyak memori buffer pool yang digunakan oleh database mana. Cuplikan ini akan memberi tahu Anda berapa banyak halaman yang bersih dan kotor (dimodifikasi sejak pos pemeriksaan terakhir atau dibaca dari disk) dari setiap basis data di kumpulan buffer. Anda dapat memodifikasi lebih lanjut.

SELECT
   (CASE WHEN ([is_modified] = 1) THEN 'Dirty' ELSE 'Clean' END) AS 'Page State',
   (CASE WHEN ([database_id] = 32767) THEN 'Resource Database' ELSE DB_NAME (database_id) END) AS 'Database Name',
   COUNT (*) AS 'Page Count'
FROM sys.dm_os_buffer_descriptors
   GROUP BY [database_id], [is_modified]
   ORDER BY [database_id], [is_modified];
GO

Saya jelaskan ini sedikit lebih banyak di posting blog ini Inside the Storage Engine: Apa yang ada di buffer pool?

Anda juga dapat checkout KB 907877 ( Cara menggunakan perintah DBCC MEMORYSTATUS untuk memantau penggunaan memori pada SQL Server 2005 ) yang akan memberi Anda gambaran tentang gangguan dari sisa penggunaan memori SQL Server (tetapi tidak per-database).

Semoga ini membantu!

Paul Randal
sumber
Kamu jenius, Paul!
marc_s
2

Teman Anda juga dapat membatasi jumlah RAM yang akan diambil SQL karena, seperti yang dikatakan Paul di atas, SQL akan mengambil setiap bit memori yang bisa.

Batasi jumlah memori yang diambil oleh SQL Server hingga 2000 Mb (atau apa pun yang menurut Anda terbaik).

--Enable advanced options:
USE master
EXEC sp_configure 'show advanced options', 1
RECONFIGURE WITH OVERRIDE

--Set the maximum amount of memory to 2000 MB:
USE master
EXEC sp_configure 'max server memory (MB)', 2000
RECONFIGURE WITH OVERRIDE

--Display the newly set configuration:
USE master
EXEC sp_configure 'max server memory (MB)'

--Set 'show advanced options' back to default:
USE master
EXEC sp_configure 'show advanced options', 0 
RECONFIGURE WITH OVERRIDE
Dave
sumber
Terima kasih - Saya sadar bagaimana membatasi memori, tetapi saya tidak tahu bagaimana mencari tahu db mana yang menggunakan berapa banyak memori buffer pool pada waktu tertentu.
marc_s