SSIS 剖析資料流之 連線和查詢轉換

2022-01-10 09:23:40 字數 4473 閱讀 2633

在ssis的資料流元件中,ssis引擎使用merge join元件和 lookup元件實現tsql語句中的inner join 和 outer join 功能,lookup查詢元件的功能更類似tsql的exists關鍵字,只檢查資料是否存在。在ssis引擎中,任何流經資料流(data flow)元件的資料都會被載入到伺服器記憶體的資料緩衝區中,資料緩衝區能夠容納的資料量決定了轉換元件的效能。

1,lookup轉換元件有乙個輸入(input),乙個查詢表(或叫快取表,引用表),對映關係和多個輸出(output)

對映關係是指lookup轉換元件的輸入(input)列和查詢列之間的相等關係,定義了輸入和引用表之間按照什麼條件進行匹配,相當於定義join子句的on條件;在建立對映關係時,使用者需要顯式指定乙個或多個對映關係,就是說,使用者需要指定哪些input列和查詢列之間具有相等關係。

lookup元件查詢的過程是:對於輸入(input)中的每乙個資料行,根據對映關係,對查詢表進行全表查詢;如果該資料行能夠在查詢表中找到相應的鍵值,那麼該資料行匹配成功,從「lookup match output」 路徑輸出到下游元件;如果不能在查詢表中找到相應的鍵值,那麼該資料行匹配失敗,從「lookup no match output」路徑輸出到下游元件。

由於輸入中每乙個行資料都會查詢整個快取表,因此,如果將查詢表資料快取在記憶體中,能夠提高lookup元件的查詢效能,lookup轉換元件提供三種快取模式來處理查詢表的資料:全部快取在記憶體,部分快取在記憶體中,每次都從資料來源中讀取。如果查詢表資料量少,請全部快取在記憶體中,以提高lookup元件的轉換效能。

lookup元件在full cache模式下是無阻塞轉換,只有lookup轉換元件在載入快取表資料時,它才會阻塞資料流。只有當快取表資料載入完成之後,查詢轉換元件才開始執行。一旦快取資料載入完成,資料以無阻塞的流式來處理資料。

2,merge join轉換元件有兩個有序的輸入(sorted input,使用sort元件排序,或者在資料庫中使用order by 子句排序)和乙個輸出(output)

在merge join轉換元件配置聯接條件(inner join,left join和full join),執行連線查詢之後,輸出相應的資料。下游元件可以使用conditional split 轉換元件,獲取匹配成功或匹配失敗的資料。merge join轉換元件沒有快取資料。

lookup 轉換的特性

1,流的特性

lookup 轉換是非阻塞轉換,具有流式轉換的特性,能夠邊載入資料,邊對資料進行轉換處理,這意味著,當新的資料行進入lookup轉換元件時,已經被處理完成的資料行會被傳遞到下游元件,而不會被攔截,就像水流一樣,綿綿不絕,直到所有資料處理完成。

當lookup轉換元件處於full cache快取模式時,lookup轉換元件在將快取表載入到記憶體中時,會阻塞資料流,直到所有的查詢資料都載入到緩衝區後,才開始真正執行資料流任務(data flow task),因此,為了提高查詢轉換的效能,確保將小表作為快取表(設定為full cache模式),而將大表的資料以流式輸入到lookup轉換元件中。

當lookup轉換元件處於partial cache或no cache快取模式時,looup 轉換元件被識別為基於行(row-based)的轉換,流經lookup轉換元件的資料行,需要與乙個外部輸入進行互動,從而被逐一處理。鑑於基於行的處理過程,在大多數情況下無法跟上資料流處理的速度,因此,緩衝區將被攔截阻塞,直到lookup轉換元件處理完緩衝區中的所有資料,所以,當lookup轉換元件處於partial cache或no cache快取模式時,通常認為lookup元件具有半阻塞性。

2,快取模式(cache mode)

lookup 轉換元件有三種快取模式(cache mode):full cache,partial cache 和 no cache

全快取模式(full cache)是指lookup 轉換元件將快取表中的資料全部載入到記憶體的資料緩衝區中,另乙個輸入中的每一行資料都會流經緩衝區,執行聯接操作。

無快取模式(no cache)是指lookup 轉換元件對上游輸入的每個資料行,都會執行一次查詢,檢查資料是否存在於快取表中。 在no cache 模式下,當每個輸入行流經lookup 轉換元件時,該元件向資料庫中的引用表傳送一條請求,檢視鍵值是否匹配,這種方式效能非常低下,速度慢。

部分快取模式(partial cache)是指lookup轉換元件在maxmemoryusage屬性限制的記憶體使用量下,將最近使用過的資料快取到記憶體中,一旦快取增長過大,最少使用的快取資料將會被丟棄。如果引用表資料量太大,而無法將其所有資料全部載入到快取中,可以選擇partial cache模式。

當package啟動時,與no cache模式一樣,不會將資料預先載入到lookup cache中,當每個輸入行進入元件時,該元件使用指定的聯接鍵以及指定的查詢來嘗試查詢匹配的記錄。如果找到匹配項,那麼及時將查詢到的鍵值新增到快取中,如果相同的鍵值再次進行查詢,那麼就可以從快取中獲取匹配鍵值,從而節省了訪問外部輸入源的查詢時間。如果在快取中沒有找到匹配的鍵值,那麼元件將訪問外部輸入源,進行查詢,如果外部輸入中也沒有,那麼鍵值不匹配。

maxmemoryusage屬性指定lookup 轉換元件在partial cache模式下所使用的最大記憶體。

1,merge join是半阻塞轉換

在向下游元件傳遞資料之前,merge join轉換元件需要將資料流攔截在緩衝區中一段時間,直到來自兩個輸入的鍵值匹配成功,merge join轉換元件才將資料行向下游元件傳遞。

2,merge join使用少量的記憶體

相比於lookup 轉換元件,merge join轉換元件只使用較少的記憶體,基本上不會快取資料,因為只需要維護記憶體中用來聯接兩個輸入所需要的少量資料。當記憶體容量有限或者,輸入的資料量過大時,merge join轉換元件是乙個非常有用的元件,但是,merge join轉換元件有乙個前提條件,輸入的資料流必須是有序的,由於sql server資料庫引擎的排序功能非常強大,因此,推薦將merge join的輸入資料流在sql server 資料庫中進行排序,避免使用sort元件對資料流進行排序。

lookup 轉換元件是唯一使用ccm(cacheconnectionmanager,簡稱ccm)對資料進行快取的元件,ccm能夠從任意資料來源中填充 lookup轉換元件的快取。如果lookup 轉換元件處於full cache 模式下,那麼使用ccm載入快取資料將會提高轉換效能。在同一package中,如果多個lookup 轉換元件使用相同的快取資料集,使用ccm快取資料,這些lookup轉換元件可以共享相同的快取,這樣,就不需要多次載入相同的快取資料。

step1,有序的輸入

在獲取資料時,使用order by子句對資料進行排序,使資料在進入資料來源元件時,是已經排過序的。

from

dbo.data_source

order

by userid asc,profileid desc

step2,設定issorted屬性為true開啟ole db source 資料來源元件的高階編輯器(advanced editor),點選「ole db source output」,將「common properties」列表中的issorted屬性設定為true。該屬性不會對資料進行排序,只是標識資料流是有序的。

step3,sortkeyposition屬性標識已排序的列和其排序的方向

在sortkeyposition屬性中,正表示公升序,負表示降序,絕對值表示位置序號,位置從1開始,依次遞增。

開啟「output columns」 輸出列列表,將userid的sortkeyposition屬性設定為1,profileid的sortkeyposition屬性設定為-2。

SSIS之資料流任務

資料流任務主要用於執行資料流以提取 轉換 載入源資料。乙個包中可以有多個資料流任務,也可以包含零個資料流任務。下面關係圖顯示含有乙個資料流任務的包 了解資料流任務後,我們就簡要的學習一下如何建立資料流任務。在工具箱中雙擊資料流任務控制項或則將其拖放到控制流頁面中。如圖 你可以根據需求來修改資料流任務...

SSIS 資料流優化

一,資料流設計優化 資料流有兩個特性 流和在記憶體緩衝區中處理資料,根據資料流的這兩個特性,對資料流進行優化。1,流,同時對資料進行提取,轉換和載入操作 流,就是在source提取資料時,轉換元件處理資料,同時destination載入資料,資料在不同元件之間,同時被處理。所有的rdbms操作都是同...

3 20 BI之SSIS之資料流轉換(合併連線)

bi之ssis之資料流轉換 合併連線 1 合併聯接轉換功能是將兩個已排序的輸入列的資料通過使用full join left join或innerr join聯接形成乙個輸出資料集。它類似於t sql語句中的連線查詢語句。但又與之有所區別。1.1 使用合併聯接要求輸入已排序的資料。而t sql中的連線...