首頁>技術>

查詢轉換(Lookup)元件用於實現兩個資料來源的連線,實現的方式是巢狀迴圈。查詢轉換通常在記憶體中快取查詢資料集,然後在輸入管道中,把輸入資料的每一行都和快取中的查詢資料集進行比較,並輸出匹配成功和失敗的資料行。

在資料流任務中,應用Lookup轉換元件,需要配置:

輸入資料:是上游資料流輸出到查詢轉換的資料;查詢資料:用於查詢的資料集,通常快取到記憶體中;兩個輸出:一個是輸出匹配成功的資料,一個是輸出匹配不成功的資料。上游資料流的一行資料跟整個查詢集進行匹配,如果匹配成功,那麼輸出匹配成功的資料,否則,輸出匹配不成功的資料;比較邏輯:Lookup 轉換元件採用的等值比較方式,當比較列相等時,匹配成功;當比較列和查詢集中的任一資料行都不相等時,匹配失敗;比較列對映:從輸入資料和查詢資料中,設定用於比較的欄位;

通常情況下,Lookup轉換元件的設計圖如下示例:

一,設定查詢資料集

在查詢轉換中,輸入資料集的每一行資料都和查詢資料集的全集進行匹配,因此,查詢資料集的讀寫速度影響查詢轉換的效能。Lookup轉換元件支援三種快取模式來讀寫查詢資料集,

Full Cache:把查詢資料集全部快取到記憶體中Partial Cache:把查詢資料集的部分資料快取到記憶體中,可以設定佔用的快取大小No Cache:不快取查詢資料集,幾乎不佔用任何記憶體

如果資料集較小,可以把查詢資料集全部快取到記憶體中,這種模式通常是最快的。如果查詢資料集太過龐大以至於無法把所有資料快取到記憶體中,可以選擇No Cache模式或者部分快取模式。對於不快取模式,當每個輸入行流經查詢表時,查詢元件向資料庫伺服器傳送一條請求,以便執行匹配查詢,這會給資料庫系統帶來沉重的效能開銷,該模式是最差的模式,請慎重使用。

而部分快取模式提供了介於全快取和No Cache之間的這種方案,在該模式中,轉換元件只快取最近使用的資料集,一旦快取增長過大,超出系統設定的快取大小的閾值,那麼最少使用的快取資料就會被丟棄。當包啟動時,與No Cache模式一樣,轉換元件不會把資料預先載入到快取中。當每個輸入行進入查詢轉換元件時,該元件使用指定鍵嘗試從查詢資料集中查詢記錄,如果查詢到匹配行,那麼把該行資料載入到本地快取中。如果相同的輸入鍵再次進行查詢轉換,那麼就可以從本地快取中獲取匹配值,而不需要從查詢資料集中,從而節省了因為訪問書庫而產生的時間。然而,如果在本地快取中沒有找到鍵,那麼元件將訪問資料庫以檢查查詢資料集。請注意,鍵不在本地快取中的原因有很多:可能是第一次查詢該鍵,可能是以前在本地快取中,但是由於記憶體壓力而釋放,或者是查詢資料集中不存在該鍵。

如果輸入行不存在與本地快取中,也不存在於查詢資料集中,那麼元件會把該行視為不匹配行,傳送到不匹配行的輸出。如果,輸入資料集中不匹配的資料行出現的頻率很高,那麼,為了避免重複呼叫資料庫,同時獲得部分快取模式帶來的好處,可以使用查詢轉換的另外一個功能:缺失快取,讓元件記憶先前沒有從查詢表中找到的鍵值,從而避免重複查詢該值所付出的代價,也就是,SSIS引擎分配部分記憶體,用於快取匹配失敗的鍵值,這樣,一旦輸入行和缺失快取中的值匹配成功,那麼就說明該行不會匹配查詢資料集;但是,一旦輸入行和缺失快取中的鍵值都不匹配,那麼就需要從本地快取或者查詢資料集中進行二次匹配,也會付出相應的代價。因此,應根據資料的分佈,選擇是否使用缺失快取。

1,設定快取模式

由於上游資料流的每一行都要和查詢資料集的所有行進行匹配,因此,對查詢資料集的訪問是非常頻繁的,為了提高效能,必須提高對查詢資料集的訪問速度。如果系統的記憶體資源允許,那麼,首選Full Cache模式,把查詢資料集駐留在記憶體中,最大可能地提高轉換查詢的執行效能。Full Cache是預設模式,在大多數情況下,該模式可以獲得最佳效能。

2,設定連結管理器的型別

查詢轉換需要從外部資料來源中匯入查詢資料集,連結管理器型別有兩種:

Cache Connection manager:快取連結管理器,把資料快取到記憶體OLE DB Connection mananger:從OLE DB 資料來源中載入資料

3,快取連結管理器

對於快取連結管理器,需要使用者手動輸入資料列,並選擇資料型別(Type),長度(Length),內碼表(Code Page),索引位置(Index Position),其中,Index Position 用於標識當前的資料列是否是索引列。

當Index Position為1,標識當前列是索引列,用於比較;當Index Position為0,標識當前列不是索引列,雖然該列不能用於比較,但是可以替換輸入列。

注意,Cache Connection manager僅僅是建立記憶體的架構(Schema),但是資料儲存在哪裡呢?這就需要使用 Cache Conversion把資料來源中的資料匯入到快取中。

4,設定比較列對映

在查詢轉換的Columns選項卡中設定比較列對映,使用Code和Codex進行等值比較,即on子句的比較條件。

如果需要使用查詢集來代替上游資料流輸入,可以勾選Available Lookup Columns的非查詢列(index 列沒有放大鏡的列),然後在Lookup operations中選擇Replace。如果要將lookup columns增加到輸出流中,在Lookup operations中選擇add as new column。

5,配置查詢轉換的輸出

查詢轉換的輸出有兩個:匹配成功始終有輸出,但是需要配置匹配不成功的輸出,如下圖:

Redirect rows to no match output :把匹配失敗的資料行輸出到no match的輸出中。

二,Lookup元件異常

Lookup元件有兩個輸入資料來源,一個是上流元件的輸出,一個是元件Lookup的資料來源,這個資料來源是在Connection選項卡中進行配置。在開發package的過程中,我發現一個異常,當Lookup資料來源沒有返回資料時,會產生異常。異常資訊如下:

[Lookup [2]] Error: Row yielded no match during lookup.[Lookup [2]] Error: SSIS Error Code DTS_E_INDUCEDTRANSFORMFAILUREONERROR. The "Lookup" failed because error code 0xC020901E occurred, and the error row disposition on "Lookup.Outputs[Lookup Match Output]" specifies failure on error. An error occurred on the specified object of the specified component. There may be error messages posted before this with more information about the failure.

異常發生的原因是no match entries的輸出,預設情況下Specify how to handle rows with no matching entries選項為Fail component。

變通方法是把:匹配失敗的資料行重定向到no macth output。在General選項卡中,將Specify how to handle rows with no matching entries 指定為 Redirect rows to no match ouput.

14
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • APP開發時長如何評估?