2010-08-20 75 views
1

我正在嘗試設置一個自動化流程來定期轉換並將大型MS SQL 2008數據庫導出到MongoDB。SQL - > MongoDB導出性能問題

SQL中的表格與MongoDB中的集合之間沒有1-1對應關係 - 例如,SQL中的地址表格被轉換爲Mongo內每個客戶記錄中嵌入的數組等等。

現在我有3個步驟:

  1. 導出所有相關的數據庫,以XML使用FOR XML查詢部分。
  2. 轉換XML使用XSLT
  3. 導入使用mongoimport

瓶頸,現在似乎#2 MONGO到mongoimport友好JSON。對於300萬個客戶記錄(每個記錄都包含人口統計信息和嵌入式地址以及訂單數組),XML-> JSON轉換需要花費數小時的時間與libxslt。

似乎很難相信沒有一個預先構建的方法來做到這一點,但我似乎無法在任何地方找到。

問題:

A)是否有任何預先存在的實用工具,我可以用它來做到這一點? B)如果不是,有沒有辦法可以加快我的過程?
C)我是否以錯誤的方式接近整個問題?

+0

更新:爲mongodb友好的JSON創建SSIS目標組件。翻譯XML和看起來像額外的步驟。我希望能夠使組件足夠靈活以進行必要的轉換/反規範化/無論您稱之爲什麼。 – user426724 2010-08-21 02:35:55

回答

0

另一種方法是遍歷每張表格,並將記錄中的信息添加到記錄中,並讓Mongo進行非規範化!例如,要添加每個電話號碼,只需查看電話號碼錶,然後爲記錄中的每個電話號碼執行一次'$ addToSet'。

您也可以並行執行此操作並單獨執行表格。這可能會加快速度,但可能會更多地「碎片化」mongo數據庫。

您可能希望在開始之前添加任何必需的索引,否則在最後添加索引可能會造成很大的延遲。

+0

我喜歡這個主意!根據你的建議,我創建了一個SSIS目標組件,它創建了適用於使用mongoimport(我假設使用$ addToSet)進行插入的JSON。這個想法是,爲了更新一個集合(例如客戶集合),我最終會得到幾個json文件(用於電話號碼,地址,人口統計信息),然後將它們一個接一個地輸入。 – user426724 2010-08-23 16:26:49

+0

Mongoimport不會使用$ addToSet。這是一個更新操作符。你將不得不編寫自定義代碼來完成它。這是我的方法的缺點是它需要自定義代碼。但它應該很容易。我會建議使用你最喜歡的編程語言,並簡單地瀏覽每個表格並使用upsert進行更新。所以你可以用$ addToSet爲每個記錄做一個upsert。我真的不知道它是否會節省時間。如果它會自動化,你會只做差異?你可以做某種觸發。 – Amala 2010-08-26 14:17:13

+0

我做了一個定製導入程序,給定一個JSON文件,$ addToSet的每個集合和$ set的每個屬性(使用$ findToModify)。在使用4,000,000條記錄進行測試時,完全未優化初始版本非常緩慢(整個過程需要大約一個小時(!))。我想我肯定會只同步差異(可能使用觸發器和時間戳字段。) 在知道任何事情之前,我需要優化所有這些。有趣的是,目前的瓶頸似乎是CPU(運行時爲100%)......這讓我很確定我的代碼中存在一些問題,呵呵。 – user426724 2010-08-30 20:20:15