天天看點

SSIS可靠性和擴充性—可擴充性

你可能對擴充性這個概念非常的熟悉,當然在SSIS中也有這個概念。這裡有幾個很有特色的屬性,這一個小節的内容中将介紹如何在SSIS中使用可擴充性特性。

  

擴充記憶體

在設計SSIS之初,資料傳輸的操作都發生在記憶體中,這樣會使資料傳輸和轉換更加的快,一個設計目标是資料傳輸隻有一條路徑。這樣消除了多次讀取或者寫入資料造成的時間消耗。這樣有一個缺點是你需要大量的資料和複雜的資料轉換要吃掉大量的記憶體,是以需要合适的對記憶體使用進行調優。

預設情況下32位的作業系統的虛拟記憶體是2GB。當然我們可以修改boot.ini檔案把它修改成3GB,不過這樣做會導緻記憶體不夠的現象。在執行單個的package的時候經常會出現這種情況,通過将一個package切分成多個package的方法可以是每個小的package占用較少的記憶體,這樣就可以充分利用2-3GB虛拟記憶體帶來的便利。最常用的差分package的方法是使用Execute Package任務來調用其他的package,這樣就可以将一部分子package放在另外一個程序中處理。要說明的是需要設定ExecuteOutOfProcess屬性來達到這個目的。

和SQL Server資料庫引擎不同的是SSIS不支援位址視窗擴充,通過切分package的方法是唯一可以提高記憶體使用率的方法。如果還需要更多的記憶體的話就要考慮使用64位的作業系統了。

使用staging資料擴充

分段資料是為了降低資料的數量,在可以一次處理所有資料的情況下為什麼還要分段地讀取或寫入資料呢?在SSAS中包含了Dimension和Partition Processing Destination之後不再需要資料庫資料作為資料源了。盡管這是另外一個話題,問題是我們需要在SSIS中使用分階段的資料嗎?可能這不是技術上的目标,但是在可靠性和可擴充性方面還是很多的可取之處。

這裡的staging也可以稱作Partition。一個data flow在一個程序中執行,但是如果考慮下面的原因這種分段就很有必要了。這些小的單元可以包含在一個小的package中或者通過下面讨論的方法來分發。分段資料隻能被另外一個package來使用,不能通過其他的正常接口來使用。是以最理想的選擇是原檔案擴充卡。這可以被稱之為橫向分段,也可通過執行多個平行的package的方式來豎向分段。

原檔案擴充卡允許你在磁盤上保留本地緩存。記憶體中的緩存結構從檔案中讀取或者寫入,避免從其他的程序中讀取或寫入使得這些擴充卡的處理速度是最快的。可以利用這些特點在磁盤中設定一個檢驗點,這樣就可以掃描多個資料流和package 。

原檔案的關鍵作用是将一個任務切分成最少兩個任務,主要的任務以原檔案目标結束,第二個任務以原檔案開始,必須保證這二者之間的緩存結構是一緻的,這樣拆分就被認為是一個完整的資料流任務,提供了更好的性能。

重置資料流

在前面的章節中我們已經看到檢驗點提供重新開機package的功能,但是在Data Flow中不能使用這個功能。如果把Data Flow切分成兩個或更多的單個的任務,他們之間通過原檔案連接配接起來,就可以重新開機整個資料流。

從哪裡劃分一個Data Flow要看個人的經驗,有兩個經常需要切分的地方,一個是分離之後,一個是轉換之後,載入之前。

在分離之後進行切分有一些好處。很多情況下資料源都是遠端的,是以在分離過程中網絡連接配接可能不那麼理想。在分離之後進行切分,當需要重新開機就不需要重複這個緩慢的步驟了。

轉換之後的切分隻是用來保證資料不表不可用的情況下轉換不被丢棄。

你可能會在資料流中添加額外的中間轉換,這樣通常會耗費更多的資源,也會增加執行那個失敗的風險。盡管可以使用錯誤輸出處理可以預見的問題,還可以使用重置點來減少重新執行的工作。

如圖1執行個體了一個例子

SSIS可靠性和擴充性—可擴充性

圖1

在這個例子中資料源連接配接着遠端資料庫,由于抽取資料要耗費很多時間以及對資料源的影響,如果分支上的處理流程失敗,影響到主流程需要重新執行整個流程是不可接受的。這樣可以選擇在源檔案後面使用一個原檔案來儲存資料,使用原資料轉換,如下圖2所示。

SSIS可靠性和擴充性—可擴充性

圖2

Flat檔案是通過區域網路中的計算機獲得的,需要在它被重新寫入之間獲得裡面的資料。如果資料量非常大,排序轉換也是一個非常昂貴的操作。是以我們需要将原檔案轉換放在排序轉換之後,如圖3

SSIS可靠性和擴充性—可擴充性

圖3

最後可以再添加一個Data Flow任務來放置staging之後的轉換,如圖4

SSIS可靠性和擴充性—可擴充性

圖4

這樣一個資料流轉換被分割成3個,如果想重新開機正果處理,可以使用一個單獨的包并且在三個分支中使用檢驗點。

跨機器擴充

将任務分割成不同的包,可以跨機器運作包。如果一個包有一些和其他的不同的配置,這樣做會很有利。有可能有些機器的配置适合做資料抽取,而有些适合處理資料,他們分布在不同的網段中,不能直接從一台機器上執行這些任務。這樣先通過一台機器來抽取資料放在原資料中,然後從另一台機器中處理資料。這是一種以組織為向導的而非以架構設計為向導的思想。

還有一種擴充是使用水準分割。一種簡單的場景是使用兩個包,第一個包從資料源中抽取資料,然後通過條件分割産生來給你個或者更多的資料分支 , 将這些分支中的資料寫入到不同的原資料轉換中。最常見的分割時根據時間來進行水準分割。目的是将抽取的資料分割成不同的塊。例如在資料源中有一個連續的時間資料列,這是最好不過的。在T-SQL中有個ROW_NUMBER()函數。相似的有一個第三方轉換ROW NUMBER轉換用來添加連續不重複的資料列,然後使用條件分割來進行分割操作。可以從

www.sqlis.com

或者

www.konesans.com

免費或者這種轉換。

在一個排序的資料集中,每個原檔案被按照順序寫入,然後流向下遊。這樣做看上去很費力,這樣是假設從開始到結束的執行時間與獲得連續資料列帶來的效率比起來不那麼重要。

獲得分割的原檔案之後,就可以在後續的包中使用這些原檔案了。每一個包在自己的機器中使用這些原檔案。通過這種方法可以在不同的機器之間擴充處理那些昂過的轉換。對于較小的擴充可以不在多個機器之間,可以放置在一個單獨的機器上,這樣每個package單獨占用一個線程,并單獨地通路資源。

資料倉庫中也有表分割,或者分析服務中的分割,也可以将他們映射到包中,這樣每個包個一個單獨的表或者分割關聯起來。

如圖5展示這種分割的例子。

SSIS可靠性和擴充性—可擴充性

圖5

在這個例子中模糊查找姓名字段,它需要參照一個有很多條資料的表,運作過程中會耗費很多的時間。為了水準低分割它,可以按照姓名的第一個字母來分隔它,盡管在生産環境中這樣可能會有一些遺漏。我們我們将姓的首字母從A到M分割到第一個原檔案中,從N到Z分割到第二個原檔案中。如圖7

SSIS可靠性和擴充性—可擴充性

圖7

理想情況下,第二個包有兩個執行個體,如圖9-39,将這兩個包放置在不同的機器中。然而,不是所有轉換任務都是使用表達式,有時候需要動态地控制他們,是以需要兩種版本的包,如圖8,建立兩個視圖,一個命名為A到M,另一個命名為N到Z。這兩個包将會從這兩個視圖中模糊查找比對的資料。

SSIS可靠性和擴充性—可擴充性

圖8

在任何要使用原檔案的時候都要權衡I/O,但是對于大規模的實作,原檔案提供了一種方法來保證一個package執行過程中資料流不會招緻其他的資料格式帶來的謬誤,進而保證資料正确性。

總結

在這個章節中,介紹了一些SSIS的一些特性用來幫助我們實作可擴充,可靠的設計例如事務和檢驗點。還可以使用資料流重新開機和跨機器擴充。雖然這些不是常見的技巧,毫無疑問使用他們可以實作功能強大的包。

作者:

Tyler Ning

出處:

http://www.cnblogs.com/tylerdonet/

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,如有問題,可以通過以下郵箱位址

[email protected]

 聯系我,非常感謝。