2011-09-12 222 views
5

我有cca 25數據庫,我需要將它合併到1個數據庫中。首先,我試圖建立一個SSIS包,它會從每個表中的所有數據複製到一個地方,但後來我得到錯誤:SSIS - 內存不足錯誤

Information: The buffer manager failed a memory allocation call for 10485760 bytes, but was unable to swap out any buffers to relieve memory pressure. 1892 buffers were considered and 1892 were locked. Either not enough memory is available to the pipeline because not enough are installed, other processes were using it, or too many buffers are locked.

然後我意識到這不是好主意,我需要只插入新記錄和更新現有的。之後,我嘗試了這個選項:

  • 獲取所有連接的列表。串
  • 的foreach分貝,複製新記錄和更新現有的(那些需要從源拷貝被更新到臨時表,從目標刪除和複製從臨時到目標表)

enter image description here

這裏的數據流任務的樣子

enter image description here

在某些情況下,數據流量超過百萬行更procceses。但是,我仍然得到相同的錯誤 - 耗盡內存。

在任務管理器的情況下:

enter image description here enter image description here

我必須指出,有28個數據庫,這同一個服務器上被複制的,當這個包沒有運行SQL服務器仍在使用超過1GB的內存。我讀過,這是正常的,但現在我並不知道...

我已經安裝了SQL Server的修補程序,我在這篇文章中找到:http://support.microsoft.com/kb/977190 但它並不能幫助... 我做錯了什麼,或者這只是事情的工作方式,我想找到一個解決方法?

感謝,

+0

你有什麼被黑掉的?一個「祕密」過程? –

回答

1

我找到了解決辦法,問題是在SQL Server - 這是消耗太多的內存。默認情況下,最大服務器內存設置爲2147483647(這是默認值)。由於我的服務器有4GB RAM,我將這個數字限制在1100MB。從那時起,沒有記憶問題,但我的流程任務非常緩慢。問題在於使用查找。默認情況下,Lookup會從Lookup表中選擇所有內容 - 我對此進行了更改,並僅選擇了需要查找的列 - 它將該過程緊固了好幾次。

現在整個合併過程大約需要1小時15分鐘。

3

如果你的Lookup轉換設置爲完全緩存您可能會遇到內存問題。從我所看到的情況來看,如果行數超過1000萬,合併連接的表現會優於查找轉換。

看看下面我已經解釋了合併連接和查找轉換之間的區別。

What are the differences between Merge Join and Lookup transformations in SSIS?

+0

我沒有看到如何使用合併連接來更新行...我也會嘗試這種方法,但我錯過了更新的部分... 謝謝! –