我想從SSIS中的SQL Server 2008加載大型數據集。但是,Visual Studio一次加載所有內容的速度太慢。然後我決定使用for-each循環來每次只加載表的一部分。如何使用每個循環來幫助加載大型數據集
E.g.如果有1000萬條記錄,我希望每次只能載入100萬條記錄,並運行10次以完成處理。我不知道如何使用Foreach Loop組件。是否有其他方法來處理大型數據集?
我想從SSIS中的SQL Server 2008加載大型數據集。但是,Visual Studio一次加載所有內容的速度太慢。然後我決定使用for-each循環來每次只加載表的一部分。如何使用每個循環來幫助加載大型數據集
E.g.如果有1000萬條記錄,我希望每次只能載入100萬條記錄,並運行10次以完成處理。我不知道如何使用Foreach Loop組件。是否有其他方法來處理大型數據集?
我認爲最好的辦法是功能上劃分你的數據。日期列在大多數情況下適合於執行此操作。我們以訂單日期爲例。
對於該列,找到最好的分母,例如,您的訂單日期每年會產生大約一百萬行。
而不是每個循環容器,使用for loop container。
要使此循環正常工作,您必須查找源數據中所有訂單日期的最小和最大年份。這些可以使用SQL語句檢索,這些SQL語句將標量結果保存到SSIS變量中。
接下來,將您的for循環容器設置爲在您之前存儲在變量中的最小和最大年份之間循環,每次迭代增加一年。
最後,實際檢索數據,你就必須源的SQL語句保存爲一個表達式中的變量與指定由您的for循環容器產生的電流年where子句:
"SELECT * FROM transactions WHERE YEAR(OrderDate) = " + @[User::ForLoopCurrentYear]
現在,您可以在數據流源中使用此變量來檢索分區數據。
編輯:
在Object
類型的SSIS變量使用for each循環容器將檢索與執行SQL任務的分區鍵,並保存該結果集不同的解決方案:
SELECT YEAR(OrderDate) FROM transaction GROUP BY YEAR(OrderDate)
對於每個循環容器,您可以使用ADO枚舉器遍歷對象,並使用與上面相同的方法將當前年份插入到源SQL語句中。
thx爲您的答案!我需要將選定的數據每次與其他表合併,這就是爲什麼我必須使用每個循環。否則,處理速度會更慢。 – Echo
如此多的變數需要覆蓋,我在5分鐘內開會。
你說這很慢。 什麼很慢?如果不知道,你可能會永遠追逐錯誤的兔子。
SSIS在2008年獲得了皇冠,爲ETL processing speed by loading 1TB in 30 minutes。當然,他們調整了系統中所有愛的bejesus,以便讓它這樣做,但他們詳細地介紹了他們採取了哪些步驟。
10M行,雖然聽起來很大,但我不認爲對SSIS徵稅。要開始,看看你的目標對象(假設OLEDB)。如果它沒有選中「快速加載」選項,則會發出10M單插入語句。這將淹沒您的交易日誌。另外看一下提交大小中的行數。 0意味着全部或全部根據您的可恢復性做出正確的決定,但確實意識到您的交易日誌所蘊含的含義(它將消耗相當多的空間)。
您對管道中的數據應用了哪些轉換?有變換會導致您的吞吐量(排序,聚合等)
創建一個基線包,它所做的全部操作是從源位置讀取N行數據並執行行計數。這對於理解您所期望的硬件的最佳理論吞吐量至關重要。
在Visual Studio/BIDS/SSDT中運行程序包比使用SQL Agent/dtexec進行調用時的運行速度要慢,有時候比通過SQL Agent/dtexec調用所獲得的經驗量級要低,因爲它不會將調試程序中的執行包裹在內。
我會修改這個答案,因爲我有時間但這些都是一些初步想法。我會在會後使用foreach循環任務來處理離散數據塊。
您是否需要將整個數據集同時加載到內存中?或者您是否可以讓它通過批量數據流進行流式傳輸?如果你的批處理設置正確,SSIS對後者非常有用。 – GShenanigan