開篇介紹
在 SSIS Dataflow 數據流中的組件可以分為 Synchronous 同步和 Asynchronous 異步這兩種類型。
同步與異步 Synchronous and Asynchronous
Synchronous 同步組件
同步組件有一個非常重要的特征 - 同步組件的輸出和它的輸入共享同一個緩存,即輸入多少行數據輸出就多少行數據。在同步轉換的過程中,輸入一行,輸出一行,輸入與輸出同步,它們同時發生。
Asynchronous 異步組件
異步組件的特征就是它的輸出使用的是一個新的緩存,它不會重用輸入的緩存,輸出的記錄有可能比輸入多,也有可能比輸入少。在異步轉換的過程中,異步組件會要求新的緩存區才會執行處理,比如向 Sort 組件,它必須要在一個操作中處理整個行集。還有像 Merge, Merge Join 等合並操作,組件要先檢查各個輸入的多個行,然后按照排序好的順序來合並輸入行。包括 Aggregate 組件,它需要新添加一行來保存計算好的聚合值。
所以這樣對比下來,通常情況下同步組件因為可以重用輸入的緩存因此要比異步組件要快一些,因為異步組件需要一塊新的緩存來完成輸出內容。
觀察所有的數據源組件,它們都是異步類型,因為它們需要創建兩個緩存,一個是成功的輸出一個是錯誤輸出,所有的目標 Destination 組件都是同步的。
阻塞,半阻塞和全阻塞 (Non-blocking, semi-blocking and Fully-blocking)
除了上面的兩種分類之外,還可以將它們分為這三種類型:Non-blocking 非阻塞, semi-blocking 半阻塞和 Fully-blocking 全阻塞。
Non-blocking 非阻塞轉換
非阻塞轉換也被稱為行轉換,也屬於同步轉換組件。組件接收到一行數據,對這一行數據處理后再輸出。在組件的整個輸出處理過程中不新建也不刪除數據行。比如從上游 Source 中加載1000條數據,經過非阻塞轉換組件的時候,每接收一行數據就處理一行,處理完畢后就直接將這一行數據傳遞給下游組件,不會等到所有的1000條數據處理完才交給下一個組件。
Semi-blocking 半阻塞轉換
半阻塞的意思就是轉換組件會控制輸入行一段時間,比如組件接收到上游的1000行數據,有可能接收到了10行或者100行數據就匯總一次,最后輸出這10行或者100行數據,或者輸出一行匯總的數據,所以每次接到一行數據並不會立即處理輸出。處理完這批數據輸出之后,就可以繼續接受其它行數據並處理再輸出,半阻塞轉換也屬於異步轉換組件。
Fully-blocking 全阻塞轉換
與半阻塞轉換相同,都是屬於異步轉換組件。但是全阻塞轉換組件會控制全部數據,上游來了1000行數據,全阻塞組件需要接受完全部的1000行數據之后才會處理輸出。比如像 Sort 或者 Aggregate 組件,它們需要接受了所有數據之后才會排序或者聚合,這個是很容易理解的。
SSIS 數據流 Data Flow 組件中的分類
如何理解 Buffer 緩存
Buffer 緩存實際上可以理解為數據流中存儲數據的容器,再說簡單一點就是一塊內存,數據流組件從外部獲取數據之后數據就保存在這個 Buffer 容器。一個 Data Flow Task 中可以有多個 Buffer, 並且要理解的是 一個 Buffer 並不是由單個組件獨有,而是可以由幾個轉換組件共享。在整個數據流中,每遇到一個異步輸出就會新創建一個 Buffer。
看一個示例,這個數據流從 OLE DB Source 組件開始 (OLE_SRC_UserDownload) 開啟一個 Buffer 容器,它是異步組件它需要開辟這個新緩存。Multicast 組件 (MC_UserDownload) 與 OLE DB Destination (OLE_DST_UserDownload) 它們是同步組件,因此它們不需要新創建緩存,因此是與它們的輸入即 OLE_SRC_UserDownload 共享這個 Buffer,如圖所示 Buffer 1 部分。
通過 Multicast 組件,產生了左右兩個分支,當遇到 Aggregate 組件 (Aggregate_Count_MaxLoadingTime) 時,因為 Aggregate 組件是一個異步完全阻塞組件,因此需要創建一個新的緩存 Buffer 容器 - Buffer 2。
在 Buffer 2 中,假設通過 Aggregate_Count_MaxLoadingTime 往下產生了兩列,那么 Buffer 2 中就定義了這兩列,當通過 Derived Column 組件 (DC_CreateAuditColumns) 衍生新的兩列時,此時 Buffer 2 就多定義了兩列,總共就定義了四列,當所有數據寫入 OLE DB Destination 組件之后 Buffer 2 也就結束了。
了解了有關 Buffer 的知識之后,可以打開所在數據流的屬性,能看到對當前數據流 Buffer 容器相關屬性的配置,比如默認緩存中的最大行數,默認緩存大小。默認緩存大小是10 MB,一個 Buffer 中最大只能處理 100 MB 數據,所以也可以設置成 100 MB,但是如果處理的數據超過100MB數據流就會多建幾個 Buffer。
更多 BI 文章請參看 BI 系列隨筆列表 (SSIS, SSRS, SSAS, MDX, SQL Server) 如果覺得這篇文章看了對您有幫助,請幫助推薦,以方便他人在 BIWORK 博客推薦欄中快速看到這些文章。
