2011-08-05 51 views
0

在加載一張桌子〜17M行(2GB左右的大小)使用BulkCopy類一個SQLServer,服務器似乎裝載約6M的記錄後,靜默運行內存不足。即我佔用了系統內存的90%以上,並且在此之後不會引起內存不足的情況,而是靜靜地繼續嘗試加載數據,這些數據變得非常慢。管理SQL Server的內存

是否有其他人遇到過類似的問題?有什麼辦法可以告訴SQLServer清除一些內存而不重新啓動它嗎?如果沒有,任何人都可以告訴我如何以編程方式重新啓動服務器? PS:我已經確認這不是我的程序正在吃掉內存。

[編輯]我運行64位Windows 7中,64位的sqlserver 2008 R2,隨着存儲器8gigs。

+0

你怎麼能夠確認你的程序不是內存消耗的原因? – RobB

+0

哦,當我殺了我的進程很多內存被釋放時比我重新啓動sql server –

回答

1

SQL有一些開銷加載所有的數據到內存中,因此雖然你可能有原始數據的2GB的存在,必須加載到內存中來跟蹤這些東西的元數據和指針和這樣的。系統上發生的事情是,您的RAM存儲空間不足以將所有內容保留在內存中,因此必須將某些頁面(操作系統用於將虛擬地址轉換爲物理地址的單元)交換到硬盤驅動器(非常慢),以便房間可以存儲更多的信息。通常將數據庫完全加載到內存中會執行此操作,因爲數據庫可能會變得很大。 Sql服務器具有自定義的內存管理功能,因此它通常會擺脫最近沒有使用過的東西,而且不久後可能不會使用。

當發生這種情況時,重新啓動Sql是真正實現此目的的唯一簡單方法,具體取決於Sql的特殊版本(MySql,MsSql等),可以通過編程方式重新啓動服務器。

3

SQL Server將分配系統上可用的所有內存。一旦達到最大內存,它將停留在那裏並且不釋放該內存。這是按設計預期的行爲。

你沒有告訴我們的信息的一些關鍵部分:

  • 多少物理內存系統是否有?
  • 是一個64位或32位操作系統?
  • 是一個64位或32位的SQL Server實例?

我的懷疑是,你看到的東西實際上是完全不相關的:在6M行,你的測試開始增長文件,並且你沒有打開instant file initialization。有很多性能計數器來看看:

而且,與任何SQL Server故障問題,下面Waits and Queues方法不能傷害。最後,如果確實是內存壓力引起的問題,那麼在Using DBCC MEMORYSTATUS to Monitor SQL Server Memory Usage有指導如何調查。

+0

謝謝!我已經添加了規格。關於文件初始化 - 我預先分配〜10G磁盤空間,只要所有數據加載並創建索引,我都不介意wallclock時間。我如何處理櫃檯?它的監測權利? 基本上,我的情況是,我知道更多的行將被添加,我的解決方法是重新啓動sqlserver以重新獲得內存,並且它愉快地加載更多內容,直到它耗盡所有內存。我會嘗試'DBCC MEMORYSTATUS'並閱讀等待和排隊,如果你在這期間想到任何東西,那就太棒了。 –

+0

我建議你檢查'sys.dm_exec_requests'中的'wait_time','wait_type','wait_resource'和'last_wait_type'值以便執行BCP。反覆檢查,當速度很快,放慢速度時,在這裏張貼你最經常看到的值。 –