Saya memiliki contoh SQL Server yang penggunaan memori secara bertahap tumbuh sampai windows tidak akan memberikannya lagi. Tampaknya logis bahwa hasil kueri besar sesekali akan menyebabkan instance tumbuh.
Apakah ada cara saya bisa meyakinkan SQL Server untuk melepaskan memori itu tidak perlu lagi (selain memulai ulang layanan)?
Sunting:
Saya menggunakan SQL Server 2000 SQL Server 8.00.2039 - SP4 (Edisi Standar)
Saya bisa mengetahuinya menggunakan permintaan berikut:
SELECT 'SQL Server '
+ CAST(SERVERPROPERTY('productversion') AS VARCHAR) + ' - '
+ CAST(SERVERPROPERTY('productlevel') AS VARCHAR) + ' ('
+ CAST(SERVERPROPERTY('edition') AS VARCHAR) + ')'
memory
sql-server
BIBD
sumber
sumber
Poster-poster lain benar bahwa ini adalah desain, tetapi Anda benar-benar ingin membatasi memori maks menjadi sedikit kurang dari RAM server Anda. Pikirkan tentang urutan kejadian ini:
Untuk menghindarinya, konfigurasikan batas memori server maks Anda menjadi sekitar 80-90% dari memori fisik Anda yang sebenarnya. Petunjuk untuk SQL 2000 di: http://msdn.microsoft.com/en-us/library/ms178067.aspx
sumber
Ini hanya akan melepaskannya jika OS menandakan bahwa itu adalah RAM yang kelaparan, atau jika Anda menghentikan dan memulai kembali layanan; yang harus dilakukan adalah membatasi jumlah maksimum SQL yang akan digunakan dengan mengkonfigurasi nilai 'max server memory'. Jika tidak ada hal lain di server yang membutuhkan RAM (dan mudah-mudahan tidak ada) saya tidak akan khawatir tentang hal itu.
sumber
Jadi, untuk merangkum jawabannya:
Tidak ada cara untuk meminta MS SQL Server untuk melepaskan memori yang tidak perlu segera. SQL Server harus secara otomatis melepaskan memori ketika diperlukan, tetapi tidak sebelum itu. Dan jika Anda mengalami masalah memori, Anda harus mengurangi nilai optin memori "maks server".
sumber
SQL Server akan mengkonsumsi memori dan tidak mengembalikannya kecuali jika diberitahu oleh sistem operasi bahwa ada tekanan memori. Seperti yang ditunjukkan oleh Portman, ini sesuai desain, dan jika Anda ingin membatasi konsumsi memori, Anda perlu mengatur memori server maksimum yang akan digunakan oleh SQL Server.
sumber
Ingatlah bahwa perilaku yang Anda semua gambarkan adalah dari SQL Server 2005 dan seterusnya, ketika manajer memori ditulis ulang untuk (antara lain) menanggapi permintaan tekanan memori dari OS.
Untuk SQL Server 2000 dan sebelumnya, sekali ia mengambil memori, ia tidak akan mengembalikannya, tidak peduli berapa banyak teriakan OS untuk itu.
CodeSlave - apakah Anda menjalankan pada 2000, 2005, atau 2008?
sumber
Pertanyaan lama, saya tahu, tetapi cara memaksa (lebih baru, setidaknya) SQL untuk melepaskan memori adalah dengan menulis aplikasi yang mengalokasikan sebanyak mungkin memori dalam potongan, menunggu (katakanlah) 15 detik (mis. Tidur (15000)) dan membebaskan memori yang dialokasikan dan keluar; Saya mencoba ini dan SQL tidak melepaskan memori sehingga sistem mendapatkan kembali RAM-nya; menulis kode seperti di atas hampir sepele menggunakan C / C ++, hanya masalah menyiapkan rantai stucts untuk menahan rantai blok memori (pointer dan ukuran), secara progresif mengurangi ukuran ketika "malloc ()" gagal hingga mencapai minimum (katakanlah kurang dari 1024) dan kemudian lintasi daftar tertaut untuk membebaskan kembali blok yang dialokasikan
sumber