2016-03-17 27 views
7

我有一個350MB的表,它具有兩個varchar(2000)列的相當寬的表。通過SSIS數據流,需要60分鐘才能通過OLEDB「快速加載」目標加載到Azure SQL DW。我將該數據流上的目標更改爲Azure Blob目標(來自SSIS Azure feature pack),並且在1.5分鐘內完成相同的數據流(並且Polybase從該新的平面文件需要大約2分鐘)。最佳的SSIS數據流設置加載到Azure SQL中的階段表DW

對於另一個來源,我有一個現有的1GB平面文件。 SSIS數據流入Azure SQL DW中的OLEDB目標需要90分鐘。將文件複製到blob存儲,並且Polybase加載需要5分鐘。

SSIS是SSIS 2014,它在與Azure SQL DW相同的區域內的Azure VM上運行。我知道批量加載比Polybase慢得多,因爲批量加載通過控制節點漏斗,但Polybase在所有計算節點上並行化。但是這些批量負載數量非常低。

什麼是SSIS數據流和目標的最佳設置,以便通過批量加載儘可能快地加載到Azure SQL DW階段表?特別是我感興趣的最優值,除了任何其他設置下面的設置,我不考慮:

  • 舞臺表幾何= HEAP(是最快的,我相信)
  • 數據流量設置:
    • DefaultBufferMaxRows =?
    • DefaultBufferSize =?
  • OLEDB目的地設置
    • 數據訪問模式=表或視圖 - 快速負載
    • 保持同一性=未選中
    • 保持空值=?
    • Table Lock =?
    • 檢查約束=?
    • 每批行數=?
    • 最大插入提交大小=?

回答

6

多鹼肯定是要加載到SQL DW的最快方式。按照您的建議HEAP也是最快的目的地類型。查看來自SQL CAT團隊的文章best practices for loading to Clustered Columnstore using SSIS。工程團隊的建議是嘗試調整DefaultBufferMaxRows(默認值爲10K),DefaultBufferSize(默認值爲10 MB),每批行數和最大插入落實大小。

很多年前,我對我們的Azure SQL數據倉庫PDW(也稱爲並行數據倉庫或APS)設備平臺系統進行了廣泛的性能測試。在那次測試中,我經常發現本地CPU是瓶頸,特別是單核。如果您按核心監控CPU使用率,則可以清楚地看到使用Perfmon。

有幾件事我可以做,以提高吞吐量。如果您在單個內核上綁定CPU,則運行多個併發SSIS軟件包將使您能夠使用更多內核,並且運行速度更快。爲此,您需要將源文件分解爲多個文件,並且目標應該是多個表格。如果對目標表進行分區並且每個負載都包含不同的分區,則可以在加載數據後使用分區切換,以便將其合併到單個表中。

你也可以嘗試在你的包中創建多個數據流,這將實現與並行運行多個SSIS加載器相同的性能,但我相信你仍然需要將源文件分解爲多個文件以及目的地,多個表來最大化吞吐量。

我試過的另一種方法是在一個數據流中使用並行裝載器。雖然這比裝載機速度快,但比前面提到的兩種方法要慢。

我還發現,如果我有SSIS做二進制字符轉換的字符,這加快了加載。此外,使用SQL源比使用文本文件作爲源更快。

你可以嘗試的另一件事是SSIS Balanced Data Distributor。 BDD是另一種利用源系統上的多個內核而不必運行多個併發SSIS包的方法。

運行SSIS包時,請使用perfmon監視CPU以查看您是在單核上運行還是在多核上運行。如果你盯着一個核心,那麼這很可能是你的瓶頸。

此外,關於VARCHAR(2000)列。如果您不確實希望傳入數據達到此大小,請減小VARCHAR列的大小。雖然我們將來會改進這種行爲,但目前我們的數據移動服務會將您的VARCHAR數據填充到固定長度。這當然意味着如果最大值遠小於2000個字符,則會有更多的數據被移動。

我希望這會有所幫助。

+0

感謝Sonya。在花費60分鐘的數據流上,將stage table從columnstore切換到HEAP使其快2-3倍,並使DefaultBufferSize(由於該行的寬度導致10,000行緩衝區,即使DefaultBufferMaxRows爲100,000)變得最大化約快2-3倍。所以現在它在8分鐘內運行。 BDD在這個特殊的測試(DWU400與mediumrc用戶)中沒有明顯的區別。我測試的其他數據流目標設置也沒有顯着差異。我認爲我們找到了前兩名的罪魁禍首。 – GregGalloway

相關問題