【第151期 April 5, 2010】
 

研發新視界

資料倉儲技術研討-使用Microsoft SSIS

作者/賴學誠

[發表日期:2010/4/5]




前言

許多企業擁有大量的資料,並將其儲存在多個不同的資料來源。為了給使用者提供有意義和可靠的資訊,企業需要提取、轉換和載入資料(Extract, Transform, and Load data,簡稱 ETL)。而第一個技術上的難題就是取得容易上手、有彈性且高效率的資料轉換工具。其困難點如下:

◎異質型資料來源:用來集中儲存資料的資料倉儲一般就是一個超大型關聯式資料庫,而提供轉進資料的各個交易系統卻可能多所不同,設計者要同時瞭解多種資料存取機制並不容易。

◎商業邏輯運算與彈性:一般在匯入資料至目的端之前,可能會先完成分割、過濾、查閱、彙總、聯集、排序...等動作。且流程中更可能以優先順序、條件判斷、交易管理、資料庫維護、錯誤處理、訊息發佈…等。且隨著資料來源增加設計用來轉換資料的物件要容易修改與重用。

◎效率:彈性與效率是互相衝突的面向,彈性表示使用者可以簡單設定後自行找到正確的處理解決方式;而效率則需要用簡單直觀的方式處理事情。大量的資料載入非常需要效率。

◎一致化:資料的標記要一致,True或False還是0跟1或是T與F等等的一致化問題。

◎週期性的處理與管理:以每天、每週、每月、每年為單位的週期性處理也是非常多見。把實際線上資料轉進資料倉儲絕對是週期性的工作,不是一次就能完全處理。

◎安全性:按照安全的最小接觸面原理,越整合的系統安全性就越低,各個介面的連接,網路流通,帳號與授權等等都是安全性的考量。

SSIS可以讓企業把來自異構資料來源的任意資料載入到資料庫。最大的變革之一就是將控制流程(Integration services run-time engine)與資料轉換流程(Integration services data flow engine)分成兩大引擎來處理。增加了使用者自行撰寫程式的標準化與方便性。

尤其在2008年2月,微軟宣佈了資料載入的一個破記錄壯舉:SSIS用不到30分鐘的時間把1 TB 的資料從平面檔案載入到SQL Server 2008。這比其他商業ETL工具的最佳時間快了30%,十分驚人。

工具介紹

SSIS部署與執行的基本單位是封裝。透過簡單的精靈逐步設定,就可以將專案內所有封裝一起部署進而簡單管理。每一個邏輯都可以設定為一個封裝,而封裝中可以設計控制流程,控制流程中還可以詳細設計資料流程。


《圖一》SSIS工具概觀


◎控制流程:於控制流程中,可以設計整個資料流向與架構。例如資料須要先刪除某些舊資料,然後再取得新資料;或是有多個資料來源,彙整到某個資料表。都可以使用控制流程的工具簡單設計。如圖二所示,SSIS已經提供許多控制點,與關鍵工作的控制項。使用者所需要的只是選取需要的工作控制項,然後安排流程,串接成所需要的工作流程與邏輯處理就可以完成設計。


《圖二》常用控制流程


◎資料流程:大多數控制流程的控制項都只需要設定參數就可以使用,而其中最重要的控制流程控制項就是"資料流程"控制項。如圖三所示使用資料流程,統計員工是否已婚,並取得數量,再寫入指定資料表中。整個資料流程設計,可以從圖形介面清楚看出邏輯,並且簡單設計與維護。


《圖三》資料流程


◎進階介紹:

1.執行SQL工作

控制流程中,若無法使用既有的控制流程元件完成設計,就可以使用"執行SQL工作"來自行撰寫控制流程語資料流程。使用這個元件,所需要的只是SQL語法與設定連接管理員。可以執行建立、卸除、新增、查詢、修改、刪除甚至預存程序與Cursor都可以使用。


《圖四》執行SQL工作,可以使用SQL查詢語法處理流程與資料邏輯


2.指令碼元件

當SSIS為資料流程所提供的既有元件不夠用時,就需要用VB.NET語法在"指令碼元件"中自行撰寫資料來源、轉換或目的等運作邏輯。由於此元件是以VSA(Visual Studio For Applications)環境撰寫,在離開VSA環境後自動將程式碼內容編譯成.NET中介語言,在封裝執行時不需另行編譯,效率會以Script語言撰寫來快得多。
且指令碼元件會根據所選擇的用途,自動產生基底指令碼,只要改寫一下指令碼就可以輕鬆入門,達到自訂的效果。不管是資料來源需要或是存入目的地時需要,或者只是中間資料轉換的需要都可以自行設計,十分靈活。


《圖五》設定指令碼元件類型,決定此元件在資料流程中的用途



《圖六》指令碼元件自動產生基底程式碼


◎專案實例:

狀況描述:例如有個資料表A。我們需要取出兩類資料,甲類與乙類,但是甲類與乙類可能同時成立且目的地是同一個資料表B,並且要做Data cleaning。

邏輯設計:因為甲類乙類可能同時成立因此需要做聯集,聯集起來的資料除了需要做某些邏輯判斷濾掉有問題的欄位,然後以LOG記錄錯誤資料以備稽查以外,還需要將正確的資料轉進另一個資料表B,轉進的過程中,或許遇到欄位型態需要轉型的問題。

邏輯設計如下圖七所示,兩個DB來源元件分別取得兩類資料,透過"聯集全部"元件做聯集,然後"多重傳遞"元件可以將一份資料分給多份邏輯使用,其中一份透過"指令碼元?quot;自行定義哪些欄位值為有誤,例如年月日欄位應該是西元年,或是身分證號需要10位等等之類的判斷然後寫入LOG;另外一份透過轉換存入B資料表,轉換可以轉換長度例如原本長度為char(10)的字串要存到nvarchar(8)的欄位就可以透過"資料轉換"元件作轉換。


《圖七》設計邏輯範例


結語

工欲善其事,必先利其器,在人力精簡的時代,如果不使用如此簡易方便的工具,維護、使用、開發上都會付出極大的人力成本。SSIS光是圖形介面的簡單設計就可以應付80%的ETL工作,剩下的20%就也可以使用進階的語法與指令讓有經驗的開發人員可以自訂處理。更重要的是效能上與SQL Server搭配更是令人無法挑剔的最佳選擇。

參考資料

1.SQL Server 2005 SSIS整合服務(胡百敬/悅知文化;2006/11/21;ISBN:9868277914)
2.http://blogs.msdn.com/sqlcrd/archive/2009/03/20/loaded-1TB-in-30-minutes-with-SSIS.aspx