2008-11-17 26 views
0

我有一個作爲Windows服務(調試模式作爲應用程序)運行的導入程序進程,它處理各種xml文檔和csv,並導入到SQL數據庫中。所有這一切都很好,直到我必須從另一個表中處理大量數據(120k行)(如我所做的xml文檔)。導入進程最大化SQL內存

我現在發現SQL服務器的內存使用量正在達到它掛起的地步。我的應用程序永遠不會收到服務器的超時時間,一切都會停止。

我仍然能夠分別對數據庫服務器的調用,但該應用程序線程只是停留在SQL活動監視器沒有明顯的線索和事件探查器沒有任何活動。

在哪裏開始解決這個問題的任何想法,將不勝感激,因爲我們已經與現在掙扎了一個多星期。

的基本結構是C#2.0使用NHibernate作爲ORM數據被拉動到實際的C#的邏輯和處理然後吐回與登錄到其他表沿相同的數據庫。


其他唯一的概率有時反而會發生的是,由於某種原因,光標在這個龐大的表,這隻能假設正在從ADO.net產生我象exec sp_cursorfetch 180153005,16的聲明是開幕,113602,100根據探查

被稱爲十萬次
+0

嘗試將明確各地的交易也許幾百記錄在一個時間。當然聽起來你正在構建一個巨大的事務堆棧。 – dkretz 2008-11-17 23:56:41

回答

0

我發現它是nHibernate創建光標放在大桌子上。我還沒有明白爲什麼,但在同時,我更換了直線前進ado.net大表的數據訪問模式要求

0

是否使用BCP運行該到SQL?如果沒有,交易日誌可能無法跟上您的輸入。在一臺測試機器,請嘗試將恢復模式,以簡單(未記錄),或者使用BCP方法來獲得數據(他們繞過牛逼記錄)

+0

我們沒有使用BCP作爲數據驗證過於複雜,我需要做一些查找等。我已經把我的試驗設備簡單模式,但它不似乎有好轉的事情 – 2008-11-17 18:12:56

0

添加到StingyJack的答案...

如果由於處理需求,您無法使用直接BCP,您是否考慮使用您的工具針對單獨的SQL Server(單獨的框)執行導入,然後運行BCP?

的關鍵是使這一工作將保持分期機器清潔 - 也就是說,除了目前沒有數據的工作集。這應該使內存使用量保持足夠低,以便導入工作,因爲您沒有按照 - 我假設 - 數百萬條記錄來訪問表。最終的結果將是這個第二個數據庫中的單個視圖或表格,當所有處理完成時,該視圖或表格可以很容易地轉換爲真實的視圖或表格。

當然,缺點是有另一個盒子...還有一個更復雜的體系結構。這一切都取決於你的模式,以及這種事情是否可以輕鬆支持...

我不得不這樣做一些非常大和複雜的我自己的進口,它的工作很好過去。昂貴,但有效。

+0

Unforunately我運行在一個單獨的框中輸入服務的那一刻而黯然實際處理我需要做的是什麼原因造成的問題,所以BCP真的ISN '無論如何回答這個問題 – 2008-11-18 09:03:44

+0

因此,您不是在SQL Server上最大化內存,而是在進程所在的位置?或者,它是否已經在輔助導入專用SQL Server上達到最高水平? (不好意思,剛剛醒來,頭昏眼花,希望能幫助任何方式,我可以......但需要更多的信息。) – 2008-11-18 11:29:12

1

當你COMMIT婷的數據?有沒有鎖定或死鎖(sp_who)?如果120,000行被認爲很大,SQL Server使用多少內存?當應用程序掛起時,是否有任何關於它掛起的點(是否爲INSERT,查找SELECT或什麼?)?

在我看來,提交大小太小了。通常在SSIS ETL任務中,對於基數超過1,000,000的來源的狹窄行,我將使用100,000的批處理大小,但即使對於非常寬的行,我也不會低於10,000。

我不會使用ORM大型ETL,除非轉換是有很多的業務規則非常複雜。即使仍然有很多相對簡單的業務轉換,我會考慮將數據加載到簡單的臨時表中,並使用T-SQL來執行所有插入操作,查找等操作。

0

既然你反正重寫它,你可能不知道,你可以直接調用BCP從.NET通過System.Data.SqlClient.SqlBulkCopy類。請參閱this article瞭解一些有趣的穿孔信息。