當前位置:首頁 » 編程語言 » sql2008內存釋放
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql2008內存釋放

發布時間: 2023-03-04 09:32:48

A. sql server 2008 r2 啟用awe後 內存的管理

會自動釋放的。內存緩存一些查詢,tempdb,存儲等。不是把所有數據放到內存裡面。你才10G,那100G,1T的怎麼辦。這涉及SQL內存管理方面。我也是粗淺的了解了一點。

B. 如何優化ms server 2008 r2 的內存釋放

SQL Server 2008 或者R2的默認內存分配是2147483647MB, 差不多算是無窮大,對於系統內存的管理策略是有多少佔多少。SQLserver會把所有處理過的SQL操作緩存在內存里,這樣就不用總去讀硬碟了。但是如果長時間運行SQL Server, 系統內存被用的差不多,再開啟其他程序就有可能會報內存不足。這時候就需要釋放內存緩存啦。一般我用以下兩種辦法:

很簡單,打開SQL Server configuration Manager,然後把SQL Server(MSSQLSERVER)重啟一下,一般默認的instance 就是MSSQLServer,當然你如果裝了其他的instance(實例)就選擇相應的,例如MSSQLServer(SQLServLatin1), MSSQLServer(ARABIC)。
這種方法最簡單有效,但是只能臨時的清除SQLServer緩存所佔的內存空間,時間長了SQLServer還會把內存占滿。而且很重要的是這種方法不能在SQLserver有連接的情況下使用,那樣會讓正在使用SQLServer的用戶暫時無法連接SQLServer,甚至導致程序處錯誤。而你作為管理員就……

第二種方法比較復雜,我也不是SQLServer高手,只是從網上學習得來的一些query:
DBCC FREEPROCCACHE

DBCC FREESESSIONCACHE

DBCC FREESYSTEMCACHE('All')

DBCC DROPCLEANBUFFERS

以上一段一般能釋放緩存,(注意引號有的時候因為word文檔里打不出英文的引號,最好拷到記事本里編輯一下)但是有的時候不是很管用。因為SQLserver不會因為Cache(緩存)釋放了而釋放內存,佔了茅坑不一定XX。此命令只會讓SQLServer不會繼續佔領新的內存,定期執行一下還可以。關鍵是還要釋放一下內存。

通過以下Query 可以看出當前伺服器所佔內存情況

SELECT * FROM sys.dm_os_performance_counters

WHERE counter_name IN ('Target Server Memory (KB)','Total Server Memory (KB)')

Target Server Memory(KB)和 Total Server Memory(KB)字面意思所得就是目標和當前SQL Server所佔的內存大小。

EXEC sp_configure 'show advanced options', 1

GO

EXEC sp_configure 'max server memory', 256

EXEC ('RECONFIGURE' )

WAITFOR DELAY '00:00:05'

EXEC sp_configure 'max server memory', 2147483647

EXEC ('RECONFIGURE' )

GO

EXEC sp_configure 'show advanced options', 0

GO

其實我用這幾句也不是很奏效,時間一長還是可能會有內存不夠的情況。

******

總的來說我的管理辦法是:

裝好了SQLServer之後立刻設置最大使用內存

EXEC sp_configure 'show advanced options', 1 -- 這句是打開advanced options

GO

EXEC sp_configure 'max server memory', 9216 -- 設置最大內存為9G,我們server 內存是16G的,留下7G足夠了

EXEC ('RECONFIGURE' )

GO

EXEC sp_configure 'show advanced options', 0 --記得用完了把advanced options關掉

GO

過一段時間覺得不行了就執行一下
DBCC FREEPROCCACHE

DBCC FREESESSIONCACHE

DBCC FREESYSTEMCACHE('All')

DBCC DROPCLEANBUFFERS

這個清緩存也很頭疼,不知道什麼時候合適,就這樣吧,管他呢,我又不是專家,出了問題大不了來機器不行。或者寫個Procere,用job定期執行。

沒辦法,SQLServer太霸道了,以上方法不是萬全之策,建議還是把SQLServer放到一邊單獨用吧。

C. sqlserver佔用內存過高,清理辦法

SQL Server對伺服器內存的使用策略是用多少內存就佔用多少內存,只用在伺服器內存不足時,才會釋放一點佔用的內存,所以SQL Server 伺服器內存往往會佔用很高。

Sql Server運行時候的緩存:
1.數據緩存:執行個查詢語句,Sql Server會將相關的數據頁(Sql Server操作的數據都是以頁為單位的)載入到內存中來, 下一次如果再次請求此頁的數據的時候,就無需讀取磁碟了,大大提高了速度。
2.執行命令緩存:在執行存儲過程,自定函數時,Sql Server需要先二進制編譯再運行,編譯後的結果也會緩存起來, 再次調用時就無需再次編譯。

清除緩存的命令(直接執行第四個命令清除所有緩存):
DBCC FREEPROCCACHE --清除存儲過程相關的緩存
DBCC FREESESSIONCACHE --會話緩存
DBCC FREESYSTEMCACHE('All') --系統緩存
DBCC DROPCLEANBUFFERS --所有緩存
注意:清除了緩存,不會釋放SQL Server所佔用的內存,所以需要通過修改SQL Server內存或重啟SQL Server伺服器來釋放內存。

修改SQL Server內存:

優化:使用以下語句查找出什麼語句占內存最高,針對占內存高的語句進行優化
SELECT SS.SUM_EXECUTION_COUNT,
T.TEXT,
SS.SUM_TOTAL_ELAPSED_TIME AS '總和時間',
SS.SUM_TOTAL_WORKER_TIME AS '執行耗時',
SS.SUM_TOTAL_LOGICAL_READS AS '總和邏輯讀數',
SS.SUM_TOTAL_LOGICAL_WRITES AS '總和邏輯寫'
FROM (SELECT S.PLAN_HANDLE,
SUM(S.EXECUTION_COUNT)SUM_EXECUTION_COUNT,
SUM(S.TOTAL_ELAPSED_TIME)SUM_TOTAL_ELAPSED_TIME,
SUM(S.TOTAL_WORKER_TIME)SUM_TOTAL_WORKER_TIME,
SUM(S.TOTAL_LOGICAL_READS)SUM_TOTAL_LOGICAL_READS,
SUM(S.TOTAL_LOGICAL_WRITES)SUM_TOTAL_LOGICAL_WRITES
FROM SYS.DM_EXEC_QUERY_STATS S
GROUP BY S.PLAN_HANDLE
) AS SS
CROSS APPLY SYS.dm_exec_sql_text(SS.PLAN_HANDLE)T
ORDER BY SUM_TOTAL_LOGICAL_READS DESC

轉自: https://www.cnblogs.com/LuoEast/p/8398406.html

D. SQL Server 2008 R2 持續佔用內存直到伺服器死機,怎麼解決

和sql server 的機制有關,sql server能訪問伺服器多少內存就會佔用多少,並不會自動釋放,可以限制資料庫伺服器的內存使用量,具體方法:右鍵點擊資料庫實例,點開屬性對話框,在內存標簽內設置 」最大伺服器內存大小「 為你想限制的大小,重啟資料庫服務就可以了。不過還是建議你先檢查下資料庫性能,做下優化!

E. SQL server2008 臨時表tempdb如何自動釋放存儲空間

sql server中如何創建,使用,釋放臨時表
drop table #Tmp --刪除臨時表#Tmpcreate table #Tmp --創建臨時表#Tmp( ID int IDENTITY (1,1) not null, --創建列ID,並且每次新增一條記錄就會加1 WokNo varchar(50), primary key (ID) --定義ID為臨時表#Tmp的主鍵 );Select * from #Tmp --查詢臨時表的數據truncate table #Tmp --清空臨時表的所有數據和約束
相關例子:
Declare @Wokno Varchar(500) --用來記錄職工號Declare @Str NVarchar(4000) --用來存放查詢語句Declare @Count int --求出總記錄數 Declare @i intSet @i = 0 Select @Count = Count(Distinct(Wokno)) from #TmpWhile @i < @Count Begin Set @Str = 'Select top 1 @Wokno = WokNo from #Tmp Where id not in (Select top ' + Str(@i) + 'id from #Tmp)' Exec Sp_ExecuteSql @Str,N'@WokNo Varchar(500) OutPut',@WokNo Output Select @WokNo,@i --一行一行把職工號顯示出來 Set @i = @i + 1 End臨時表可以創建本地和全局臨時表。本地臨時表僅在當前會話中可見;全局臨時表在所有會話中都可見。
本地臨時表的名稱前面有一個編號符 (#table_name),而全局臨時表的名稱前面有兩個編號符 (##table_name)。
SQL 語句使用 CREATE TABLE 語句中為 table_name 指定的名稱引用臨時表:
CREATE TABLE #MyTempTable (cola INT PRIMARY KEY)INSERT INTO #MyTempTable VALUES (1)
如果本地臨時表由存儲過程創建或由多個用戶同時執行的應用程序創建,則 SQL Server 必須能夠區分由不同用戶創建的表。為此,SQL Server 在內部為每個本地臨時表的表名追加一個數字後綴。存儲在 tempdb 資料庫的 sysobjects 表中的臨時表,其全名由 CREATE TABLE 語句中指定的表名和系統生成的數字後綴組成。為了允許追加後綴,為本地臨時表指定的表名 table_name 不能超過 116 個字元。
除非使用 DROP TABLE 語句顯式除去臨時表,否則臨時表將在退出其作用域時由系統自動除去:
當存儲過程完成時,將自動除去在存儲過程中創建的本地臨時表。由創建表的存儲過程執行的所有嵌套存儲過程都可以引用此表。但調用創建此表的存儲過程的進程無法引用此表。
所有其它本地臨時表在當前會話結束時自動除去。
全局臨時表在創建此表的會話結束且其它任務停止對其引用時自動除去。任務與表之間的關聯只在單個 Transact-SQL 語句的生存周期內保持。換言之,當創建全局臨時表的會話結束時,最後一條引用此表的 Transact-SQL 語句完成後,將自動除去此表。 在存儲過程或觸發器中創建的本地臨時表與在調用存儲過程或觸發器之前創建的同名臨時表不同。如果查詢引用臨時表,而同時有兩個同名的臨時表,則不定義針對哪個表解析該查詢。嵌套存儲過程同樣可以創建與調用它的存儲過程所創建的臨時表同名的臨時表。嵌套存儲過程中對表名的所有引用都被解釋為是針對該嵌套過程所創建的表,例如:
CREATE PROCEDURE Test2ASCREATE TABLE #t(x INT PRIMARY KEY)INSERT INTO #t VALUES (2)SELECT Test2Col = x FROM #tGOCREATE PROCEDURE Test1ASCREATE TABLE #t(x INT PRIMARY KEY)INSERT INTO #t VALUES (1)SELECT Test1Col = x FROM #tEXEC Test2GOCREATE TABLE #t(x INT PRIMARY KEY)INSERT INTO #t VALUES (99)GOEXEC Test1GO
下面是結果集:
(1 row(s) affected)
Test1Col ----------- 1
(1 row(s) affected)
Test2Col ----------- 2
當創建本地或全局臨時表時,CREATE TABLE 語法支持除 FOREIGN KEY 約束以外的其它所有約束定義。如果在臨時表中指定 FOREIGN KEY 約束,該語句將返回警告信息,指出此約束已被忽略,表仍會創建,但不具有 FOREIGN KEY 約束。在 FOREIGN KEY 約束中不能引用臨時表。
考慮使用表變數而不使用臨時表。當需要在臨時表上顯式地創建索引時,或多個存儲過程或函數需要使用表值時,臨時表很有用。通常,表變數提供更有效的查詢處理。

F. SQL Server 2008 R2 持續佔用內存直到伺服器死機,怎麼解決

sql的性能優化需要調試了,你sql的讀寫頻繁的話還要增加8g內存

G. SQL Server 2008 R2佔用內存越來越大怎麼解決

這些佔用著的內存,其實是數據緩存.如果內存夠大,那就別刪了.刪除後會減低性能和效率.

如果一定要刪,實質上是通過最大值開限制內存開銷:

1、滑鼠右鍵實例-->屬性-->內存

2、設定最大內存 即可

3、

H. 如何釋放sql server佔用的資源內存

sql server 在查詢大數據量的數據時,總會佔用大量的內存,並且居高不下,一不小心就會死機。
下面這個是我從網上找到的:
當你查詢數據的數據量比較大時,sqlserver會把查詢結果緩存在內存中,保證你下次查詢同樣的記錄時會很快得到結果,所以內存使用量會激增。
在你完成此次查詢後,sqlserver不會馬上釋放內存,數據會仍然放在內存中,這是sqlserver的優化策略,sqlserver會不斷地佔用你的系統內存,來加快sqlserver的運行速度,當你的系統中的其它服務也需要內存時,它才會自動釋放部分內存。一句話,sqlserver不會讓你的系統有閑置的內存,除非你設置sqlserver的最大內存使用量。這樣也沒什麼不好,如果你的系統很大,單獨給sqlserver一台機器,這樣會提高它的性能。
如果你只是開發用,要想讓sqlserver釋放內存,重啟sqlserver的服務就行了。如果不想讓sqlserver佔用太多內存,設置sqlserver的最大內存佔用量.