2011-04-26 116 views
15

我們有一個擁有幾百個數據庫的SQL Server。該服務器上的許多數據庫每週只能使用幾次。我們遇到了SQL Server有時變得非常慢的問題。當發生這種情況時,內存使用率指示99%,併發生分頁。爲了解決這個問題,我們計劃每晚重新啓動SQL服務以卸載所有這些數據庫並釋放內存。如何釋放空閒SQL Server數據庫使用的內存?

釋放空閒數據庫使用的內存而不關閉SQL服務的正確方法是什麼?我們希望自動卸載在過去30分鐘內未訪問的任何數據庫。

注意:我正在尋找一個適用於SQL 2005的解決方案。但是,如果SQL 2008中有一個功能需要這樣做,我想知道它。

回答

4

首先我建議尋找到:

DBCC FREEPROCCACHE 

DBCC DROPCLEANBUFFERS 

他們不是特定的數據庫,但他們可以代替你每晚的重啓。

對於特定於數據庫的命令,您可以發出CHECKPOINT來強制任何髒頁面到磁盤,但它只適用於寫入。

在SQL Server 2008(和R2)企業版你可以利用的資源調控到存儲切片成池和奉獻的較大部分的關鍵數據庫允許CPU和內存的更精細的控制。然而,要做到這一點需要徹底的計劃和測試。

+0

如果您發佈的代碼,XML或數據樣本,** **請在高亮文本編輯器這些線路上,並點擊了的「代碼示例」按鈕('{}')編輯器工具欄很好地fo rmat和語法突出顯示它! – 2011-04-26 20:27:50

10

SQL Server將自動釋放所有可以釋放的內存並且將避免分頁。如果遇到分頁,則99%的內存正在使用中,無法釋放。您需要研究如何使用內存,它可能是外部組件,如sp_oa_xxx創建的對象或分佈式查詢。首先調查內存消費者,看看sys.dm_os_memory_clerks並閱讀How to use the DBCC MEMORYSTATUS command to monitor memory usage on SQL Server 2005

作爲一個側面說明,你已經有了不屬於自動關閉數據庫使用的手段:alter database <dbname> set auto_close on

AUTO_CLOSE:當設置爲ON時, 數據庫完全關閉其 資源在最後的 用戶退出後被釋放。當用戶嘗試再次使用 數據庫時,數據庫自動重新打開 。

如果您託管數百個很少使用的數據庫,那麼AUTO_CLOSE就是您正在尋找的。

+1

很明顯,您需要驗證內存是否由SQL Server使用,以開始... – 2011-04-26 19:11:00

+1

AUTO_CLOSE:在最後一次連接退出後立即關閉數據庫太積極。我們的應用程序每分鐘連接和斷開幾次。我不想每分鐘卸載/加載數據庫幾次。我不想依賴應用程序的連接池邏輯。 30分鐘超時會更合適。 – Sylvain 2011-04-26 19:40:13

+0

我會查看您的鏈接來調查內存使用情況。 – Sylvain 2011-04-26 19:41:20

2

試試這個:

ALTER DATABASE blah SET AUTO_CLOSE ON; 

此設置(這通常不推薦用於生產)可能適合你的情況。此設置將在SQL Server 2005和2008中運行。

欲瞭解更多信息:http://msdn.microsoft.com/en-us/library/bb522682.aspx

+0

如果您發佈代碼,XML或數據樣本,請**在文本編輯器中突出顯示這些行,然後單擊編輯器工具欄上的「代碼示例」按鈕(「{}」)以精確地對其進行格式化和語法突出顯示! – 2011-04-26 20:28:11

0

我以前有過這樣的問題,我發現這個問題,你可以創建一個存儲過程的解決方案,如下所述:您啓動應用程序之前,您應該調用模式這個存儲過程1,因爲你需要足夠的內存

對於SQL操作和關閉應用程序之前,你必須在模式0

Create Proc [dbo].[MP_Rpt_ConfigureMemory] 
    (@Mode bit) 
as 
    declare @RAM as integer 
    declare @MAX as integer 
    declare @MIN as integer 

    set @RAM = (SELECT 
        [physical_memory_in_bytes]/1048576 AS [RAM (MB)] 
       FROM [sys].[dm_os_sys_info]) 

    Set @MAX = ((@RAM/4) * 3) 
    Set @MIN = ((@RAM/4) * 1) 

    if @Mode = 0 
    begin 
     exec SP_Configure 'min server memory', 1 
     RECONFIGURE 

     exec SP_Configure 'max server memory', 100 
     RECONFIGURE 
    end 
    else 
     if @Mode = 1 
     begin 
      exec SP_Configure 'max server memory', @MAX 
      RECONFIGURE 
      exec SP_Configure 'min server memory', @MIN 
      RECONFIGURE 
     end 
+0

下次您發佈相同的問題的答案,請c&p的_formatted_版本;-) – kleopatra 2012-11-28 13:17:40

+0

@kleopatra對不起,我沒有得到你的意思:( – 2012-11-28 13:47:15

+0

沒什麼不好,只是提醒_not_混合代碼和正常文本:正如你無意中在你的介紹文本的四個主要空格處所做的那樣。我在這裏和之前的回答中編輯過的 - 懶惰的我希望我不必在你的下一次再做一次:-) – kleopatra 2012-11-28 13:50:36

1

再次調用此存儲過程,2012年MSSQL;先運行以下

EXEC sys.sp_configure N'max server memory (MB)', N'256' 
GO 
RECONFIGURE WITH OVERRIDE 
GO 

然後檢查任務管理器查看內存下降到256 MB(或更高,因爲你在上面設置)

然後運行這個(與MB替換2048你要分配定期):

EXEC sys.sp_configure N'max server memory (MB)', N'2048' 
GO 
RECONFIGURE WITH OVERRIDE 
GO 
+0

你建議他們這在生產服務器上? – SchmitzIT 2015-01-24 19:03:37

+0

當然可以。然而,時機將非常關鍵。喜歡在工作時間外或工作餘額爲@最低點時執行此操作。 – HGMamaci 2015-01-30 15:32:23