ETL开发
要進(jìn)入開(kāi)發(fā)階段,了解不同的ETL產(chǎn)品。
整個(gè)ETL系統(tǒng)中,時(shí)間或更精確的,吞吐量是主要關(guān)心的內(nèi)容。這種轉(zhuǎn)換處理任務(wù)設(shè)計(jì)的主要目的歸根結(jié)底是使得數(shù)據(jù)裝載到展現(xiàn)表中最快并使得最終用戶(hù)能快速的從這些表中得到響應(yīng)。
推或者拉:推,是源系統(tǒng)主動(dòng)把文件推向ETL服務(wù)器,拉是ETL服務(wù)器主動(dòng)從文件服務(wù)器上抽取文件。無(wú)論是推拉都得保證數(shù)據(jù)沒(méi)有錯(cuò)誤,傳輸完成,確保傳輸完全的一個(gè)簡(jiǎn)單的標(biāo)志是使用標(biāo)志(信號(hào))文件。標(biāo)志僅僅表示它相關(guān)的文件的可讀性。
預(yù)裝載中的數(shù)據(jù)排序
源數(shù)據(jù)在數(shù)據(jù)庫(kù)中的時(shí)候,排序很容易通過(guò)數(shù)據(jù)庫(kù),查詢(xún)數(shù)據(jù)的order by來(lái)實(shí)現(xiàn),但是如果源數(shù)據(jù)來(lái)自平面文件,那么開(kāi)始ETL處理之前需要一個(gè)排序的程序:在主機(jī)系統(tǒng)中排序
使用數(shù)據(jù)庫(kù)的塊加載工具加速數(shù)據(jù)插入
用排序,抽取,聚合等方法把數(shù)據(jù)源的數(shù)據(jù)盡快的加載到ETL服務(wù)器之后,你將面臨把大量的必要的數(shù)據(jù)加載到數(shù)據(jù)倉(cāng)庫(kù)。這個(gè)時(shí)候用到了數(shù)據(jù)庫(kù)管理系統(tǒng)中的塊加載功能。在數(shù)據(jù)庫(kù)交互方面,塊加載器比普通的sql語(yǔ)句效率更高。
Oracle 的sql loader如何提升的性能:1 SQL Loader對(duì)表使用一個(gè)排他鎖,防止其他的操作 2 在直接模式中不能強(qiáng)制使用數(shù)據(jù)庫(kù)約束(主鍵和唯一鍵約束,外鍵約束等)如果發(fā)生沖突,相關(guān)的索引將處于不穩(wěn)定的狀態(tài),在重建索引之前需要手動(dòng)清除 3 外鍵約束在直接加載過(guò)程中不可用,在加載后才可以重新啟用 4 在直接模式中,插入觸發(fā)器在行插入時(shí)候不被啟動(dòng)
Oracle 是 sql loader SQL Server是 BulkCopyProgram
盡管在使用塊加載夾在數(shù)據(jù)到數(shù)據(jù)倉(cāng)庫(kù)之前,你必須花費(fèi)更多的IO性能來(lái)將數(shù)據(jù)寫(xiě)到物理文件中,但是他比數(shù)據(jù)直接訪問(wèn)數(shù)據(jù)庫(kù)并用insert語(yǔ)句來(lái)加載要塊的多
管理數(shù)據(jù)特性來(lái)提高性能
數(shù)據(jù)庫(kù)有強(qiáng)大的特性 如索引,視圖,觸發(fā)器,主外鍵約束等,區(qū)別于平面文件。當(dāng)數(shù)據(jù)庫(kù)增長(zhǎng)時(shí)管理這些特性將消耗大量的系統(tǒng)資源,結(jié)果是大大降低了ETL裝載過(guò)程的性能。
提高裝載性能的選項(xiàng):
1 加載數(shù)據(jù)之前去除 主外鍵(參考完整性)約束。在外鍵約束的時(shí)候,每一行加載到數(shù)據(jù)庫(kù)系統(tǒng)的外鍵列的數(shù)據(jù)都要與其浮標(biāo)的主鍵值進(jìn)行比較。通過(guò)去除多外間約束的事實(shí)表中的外鍵約束可以大大提高性能。(當(dāng)加載完數(shù)據(jù)之后啟用外鍵約束時(shí)數(shù)據(jù)庫(kù)校驗(yàn)表中的每一行)
2保持數(shù)據(jù)庫(kù)統(tǒng)計(jì)表詳細(xì)到天。(數(shù)據(jù)庫(kù)統(tǒng)計(jì)表由數(shù)據(jù)庫(kù)管理系統(tǒng)管理,他跟蹤所有表的大小,索引中唯一值的大小和數(shù)量以及其他關(guān)于數(shù)據(jù)如何有效存儲(chǔ)在數(shù)據(jù)庫(kù)中的事實(shí),當(dāng)一個(gè)sql語(yǔ)句提交到數(shù)據(jù)庫(kù)管理系統(tǒng),他使用這些統(tǒng)計(jì)表來(lái)判斷提供請(qǐng)求的數(shù)據(jù)的最快的訪問(wèn)路徑,最理想的是每次加載完之后更新統(tǒng)計(jì)表)加載處理是經(jīng)常性的。分區(qū)存儲(chǔ)大表能提高更新統(tǒng)計(jì)表的速度,因?yàn)榻y(tǒng)計(jì)表不必刷新所有的靜態(tài)分區(qū)而僅僅是當(dāng)前的分區(qū)
3在數(shù)據(jù)庫(kù)中重組碎片數(shù)據(jù),當(dāng)經(jīng)常性的更新或者刪除會(huì)使得表變成碎片,導(dǎo)致響應(yīng)時(shí)間變慢。處理大事實(shí)表的時(shí)候,最小化發(fā)生類(lèi)似碎片的一種方法是創(chuàng)建分區(qū)表。一般根據(jù)時(shí)間分區(qū)
次序
當(dāng)加載一個(gè)數(shù)據(jù)倉(cāng)庫(kù)的時(shí)候,一個(gè)批處理中作業(yè)的排列次序是至關(guān)重要的,主要原因是ETL需要在數(shù)據(jù)倉(cāng)庫(kù)中強(qiáng)制參考完整性(RI)。ETL處理要避免在數(shù)據(jù)倉(cāng)庫(kù)中創(chuàng)建孤兒(外建不存在主建)
執(zhí)行參考完整性:數(shù)據(jù)倉(cāng)庫(kù)的數(shù)據(jù)是通過(guò)一個(gè)可控的過(guò)程-ETL系統(tǒng)以塊的方式加載的。數(shù)據(jù)進(jìn)入數(shù)據(jù)倉(cāng)庫(kù)的入口是可控的和可管理的環(huán)境,數(shù)據(jù)庫(kù)級(jí)別的RI約束一般在數(shù)據(jù)倉(cāng)庫(kù)中不起作用,因?yàn)閿?shù)據(jù)倉(cāng)庫(kù)以來(lái)ETL來(lái)保證其完整性。RI在數(shù)據(jù)倉(cāng)庫(kù)中一般不用的另外一個(gè)原因是這樣會(huì)在數(shù)據(jù)庫(kù)級(jí)最小化管理費(fèi)用來(lái)增加加載性能。當(dāng)數(shù)據(jù)庫(kù)中的RI啟用的時(shí)候,每行數(shù)據(jù)在插入之前都要測(cè)試是否符合RI,也就是每一個(gè)外建都有一個(gè)父在他所要參考的表中。數(shù)據(jù)倉(cāng)庫(kù)的RI比交易系統(tǒng)的簡(jiǎn)單,交易系統(tǒng)中每個(gè)表和其他的表相關(guān),引起相關(guān)表的復(fù)雜網(wǎng)。在緯度的數(shù)據(jù)倉(cāng)庫(kù)中規(guī)則很簡(jiǎn)單:事實(shí)表的每一個(gè)外建都必須在緯度表中有一個(gè)相關(guān)的主建,緯度表中的每個(gè)主建不必再事實(shí)表中有一個(gè)相關(guān)的外建。實(shí)際上,事實(shí)可能與一個(gè)緯度中的多個(gè)記錄向關(guān)聯(lián)(緯度可能是雪花形)
以下的列表提供一個(gè)對(duì)一個(gè)假設(shè)的數(shù)據(jù)集市的加載過(guò)程的順序位置的指導(dǎo)。1 子維度(支架) 2維度3橋連接表4事實(shí)表5層次映射6聚合(縮小的)維度7聚合事實(shí)表
子緯度: 一個(gè)子緯度,是直接將一個(gè)緯度附加到另外一個(gè)緯度上,這個(gè)時(shí)候可以叫做雪花模型。子緯度一般地一個(gè)加載到數(shù)據(jù)倉(cāng)庫(kù)中,因?yàn)橐蕾?lài)關(guān)系鏈?zhǔn)加谧钸h(yuǎn)的表,也就是子緯度。事實(shí)表依賴(lài)惟獨(dú),而惟獨(dú)依賴(lài)子緯度。
緯度:一旦子惟獨(dú)加載了,你就可以加載惟獨(dú)了,唯獨(dú)需要用子惟獨(dú)中的代理建來(lái)做對(duì)照,因此它可以在加載過(guò)程中插入到惟獨(dú)中。緯度家在必須在繼續(xù)處理之前完全成功,如果失敗,調(diào)度程序必須在那個(gè)失敗點(diǎn)上停止加載過(guò)程來(lái)阻止剩下的作業(yè)的加載。
橋連接表:當(dāng)一個(gè)事實(shí)表的記錄對(duì)應(yīng)多個(gè)緯度記錄的時(shí)候,橋連接表位于惟獨(dú)表和事實(shí)表之間,橋連接表也可以用在唯獨(dú)表和多個(gè)子惟獨(dú)表關(guān)系中。這些標(biāo)在惟獨(dú)表完成之hou事實(shí)表加載之前開(kāi)始立即加載
事實(shí)表:在這里RI是強(qiáng)制的,因此必須確保事實(shí)表中每一個(gè)外建都有來(lái)自相關(guān)緯度或者橋連接表的相應(yīng)的主建。事實(shí)表一般在數(shù)據(jù)倉(cāng)庫(kù)加載中是各種表類(lèi)型中最耗時(shí)的;你應(yīng)該在所有與這個(gè)事實(shí)表相關(guān)的表都已經(jīng)加載后才開(kāi)始加載事實(shí)表。不要等到數(shù)據(jù)倉(cāng)庫(kù)中所有的維度表加載完成才開(kāi)始進(jìn)行事實(shí)表的加載。由于存儲(chǔ)在事實(shí)表中的數(shù)據(jù)容量一般非常大,以并行處理來(lái)加載是不錯(cuò)的思路。調(diào)度程序應(yīng)該將ETL 過(guò)程分為多個(gè)線程,這樣可以同時(shí)運(yùn)行并從并行處理獲益。
層次影射表:層次影射表專(zhuān)門(mén)設(shè)計(jì)來(lái)在惟獨(dú)中的層次中來(lái)回移動(dòng)。層次影射表不依賴(lài)于事實(shí)或者橋連接表(除非事實(shí)表包本身含層次)。一般來(lái)說(shuō),層次表可以緊跟在與之相關(guān)的惟獨(dú)表后加載。無(wú)論層次在批處理中物理位置如何,他的成功失敗都不影響這個(gè)皮處理中的其他的處理。不要因?yàn)閷哟斡吧浔硎【徒K止已經(jīng)開(kāi)始的事實(shí)表的處理,影射表可以獨(dú)立的重新開(kāi)始任何事實(shí)表的加載。
聚合和分組對(duì)性能的影響:聚合函數(shù)和group by語(yǔ)句要求數(shù)據(jù)庫(kù)利用大量的臨時(shí)表空間。臨時(shí)表空間是DBMS管理的一個(gè)特殊的區(qū)域,用來(lái)存儲(chǔ)需要處理的某些包含排序查詢(xún)的工作表。SQL在執(zhí)行它的服務(wù)器上進(jìn)行處理。這就意味著如果你試圖在你的抽取查詢(xún)中進(jìn)行數(shù)據(jù)聚合,你將很可能撐破源交易系統(tǒng)分配的臨時(shí)表空間。當(dāng)你需要建立一個(gè)聚合表時(shí),比較好的處理是利用ETL 引擎或第三方工具的特殊功能來(lái)加快排序數(shù)據(jù)的速度。你應(yīng)該使用支持增量更新到聚合的專(zhuān)門(mén)工具來(lái)逐步調(diào)整你的聚合。
不要試圖用帶Group By 語(yǔ)句的SQL 在你的數(shù)據(jù)抽取查詢(xún)中執(zhí)行聚合。GroupBy語(yǔ)句用語(yǔ)句中所有的列來(lái)建立一個(gè)隱含排序。交易系統(tǒng)一般不會(huì)配置來(lái)處理巨大的排序操作,因?yàn)檫@樣的查詢(xún)可能摧毀源數(shù)據(jù)庫(kù)。抽取必要的原子級(jí)數(shù)據(jù)并隨后在ETL 管道中利用ETL 引擎或?qū)S?/strong>排序程序來(lái)聚合
使用標(biāo)量函數(shù)對(duì)性能的影響:函數(shù)有參數(shù),會(huì)給查詢(xún)施加壓力,尤其那些必須一個(gè)字符一個(gè)字符的評(píng)估值的函數(shù)。如SUBSTR(),CONCAT(),TRIM(),ASCII().數(shù)據(jù)庫(kù)在處理函數(shù)方面變得越來(lái)越好。Oracle 已經(jīng)引入基于函數(shù)的索引,這樣對(duì)包含基于函數(shù)約束的查詢(xún)的響應(yīng)時(shí)間就加快了。
避免使用觸發(fā)器
克服ODBC瓶頸:第3 章提供深入分析開(kāi)放數(shù)據(jù)庫(kù)連接管理器(ODBC)的各個(gè)層。在你的ETL 引擎和數(shù)據(jù)庫(kù)之間進(jìn)行通信時(shí)ODBC 并不是必須的,它可以—應(yīng)該—避免。ODBC 在每個(gè)SQL 語(yǔ)句上增加代碼層。它相當(dāng)于在引導(dǎo)一個(gè)類(lèi)時(shí)使用一個(gè)轉(zhuǎn)換器。這個(gè)消息最終可以通過(guò)但是這是很慢的過(guò)程。因此有時(shí)候,時(shí)間就耗費(fèi)在這個(gè)轉(zhuǎn)換上了。在處理中嘗試獲得本地驅(qū)動(dòng)程序來(lái)參與在ETL 引擎和數(shù)據(jù)庫(kù)之間的通信。記住,就像一條鏈子,它的強(qiáng)度取決于它的最薄弱的一環(huán)一樣,ETL 只是與它的最慢的部分一樣快。
利用并行處理的優(yōu)勢(shì):以并行方式處理ETL是提高性能的最強(qiáng)大的方法。一次同時(shí)多個(gè)操作。
1 并行抽取查詢(xún):大多數(shù)DBMS 有并行處理查詢(xún)的能力,實(shí)際上它是同樣的處理同時(shí)集約的管理內(nèi)存。最優(yōu)化并行解決方案一般由兩種技術(shù)組成—產(chǎn)生幾個(gè)抽取查詢(xún),每個(gè)有不同范圍的值,接著以數(shù)據(jù)庫(kù)特定的并行查詢(xún)技術(shù)來(lái)并行執(zhí)行每一個(gè)處理。那些支持它的每個(gè)數(shù)據(jù)庫(kù)都有它本身執(zhí)行并行查詢(xún)的語(yǔ)法。在Oracle 中,通過(guò)在建表時(shí)設(shè)置degree 參數(shù)來(lái)啟用并行功能
2 并行轉(zhuǎn)換:購(gòu)買(mǎi)一個(gè)可以進(jìn)行本地并行操作的工具,手動(dòng)復(fù)制一個(gè)過(guò)程,分割輸入數(shù)據(jù),然后并行執(zhí)行這些過(guò)程。如果你確實(shí)有大量的數(shù)據(jù)需要放入數(shù)據(jù)倉(cāng)庫(kù),順序的處理所有的ETL操作是不夠的,那就必須找到一種ETL工具,可以提供天然的并行方式處理多個(gè)操作來(lái)獲得最佳的吞吐量(這里并行功能是轉(zhuǎn)換引擎直接內(nèi)置的,不是執(zhí)行并行擴(kuò)展)
3 并行最終加載:產(chǎn)生sql loader多處理,每個(gè)分區(qū)一個(gè),并且并行運(yùn)行,當(dāng)執(zhí)行許多sql loader處理的時(shí)候,必須設(shè)計(jì)parallel的參數(shù)為true。
性能問(wèn)題糾錯(cuò)
當(dāng)發(fā)現(xiàn)一個(gè)奇怪的作業(yè)使得性能相當(dāng)緩慢的時(shí)候,不要?jiǎng)h除他,直接采取一種程序化的方法來(lái)找出處理中引起瓶頸的操作并標(biāo)出那個(gè)特殊的操作。監(jiān)視如CPU,內(nèi)存,I/O和網(wǎng)絡(luò)流量這些地方來(lái)判斷任何高層次的瓶頸。如果沒(méi)有任何瓶頸,那么需要深入代碼分析,使用排除過(guò)程來(lái)縮小潛在的瓶頸范圍。但整個(gè)SQL語(yǔ)句手工編寫(xiě),分割會(huì)很困難,實(shí)際上所有的ETL工具都提供一種用來(lái)把處理分割成獨(dú)立部分的機(jī)制以幫助判斷無(wú)法預(yù)知的瓶頸。最佳策略是:從抽取開(kāi)始,順序沿著每個(gè)激素,對(duì)照,聚合,篩選等轉(zhuǎn)換操作,最后測(cè)試實(shí)際數(shù)據(jù)加載到數(shù)據(jù)倉(cāng)庫(kù)的IO。
可以按照下列步驟來(lái)標(biāo)志出瓶頸:1 隔離并執(zhí)行抽取查詢(xún) 2 關(guān)閉篩選 3去掉查找 4 謹(jǐn)慎的排序和聚合,很多時(shí)候在數(shù)據(jù)庫(kù)和ETL工具之外(操作系統(tǒng)中)進(jìn)行排序或預(yù)先排序更快 5 隔離和分析每個(gè)計(jì)算或轉(zhuǎn)換,隔離和分析每個(gè)計(jì)算或轉(zhuǎn)換是檢測(cè)和補(bǔ)救瓶頸的一個(gè)好方法 6消除更新策略 7 檢查數(shù)據(jù)庫(kù)IO
增長(zhǎng)的ETL吞吐量。ETL小組都期望有最大吞吐能力的ETL流程,為此,推薦10個(gè)規(guī)則來(lái)幫廚ETL提高水平。
1 減少I(mǎi)/O ,以管道的方式處理ETL流程,保證數(shù)據(jù)從開(kāi)始抽取階段到最后裝載都是在內(nèi)存中處理
2消除數(shù)據(jù)庫(kù)讀寫(xiě),當(dāng)把數(shù)據(jù)寫(xiě)入磁盤(pán)的時(shí)候,最好用平面文件代替數(shù)據(jù)庫(kù)表
3盡可能的過(guò)濾,盡可能的在處理的上游減少記錄數(shù)目,避免不必要的數(shù)據(jù)進(jìn)入數(shù)據(jù)倉(cāng)庫(kù)目標(biāo)表
4分區(qū)和并行,多線程并行處理,用并行DML在源系統(tǒng)中并行查詢(xún),用管道方式并行處理數(shù)據(jù),分區(qū)設(shè)計(jì),并行裝載目標(biāo)表
5更新增量聚合,重構(gòu)聚合對(duì)處理消極影響很大,盡量避免,只是更新
6只抓去需要的行列,避免不需要的記錄
7塊裝載/減少日志,使用數(shù)據(jù)庫(kù)塊轉(zhuǎn)換功能,減少更新操作,用刪除插入代替,關(guān)閉日志,把direct設(shè)置為true
8刪除數(shù)據(jù)庫(kù)約束和索引,如果必須外鍵,那么ETL處理之前先刪除,之后在后置任務(wù)上再加上
9消除網(wǎng)絡(luò)擁堵。保證文件是在本地磁盤(pán),ETL服務(wù)器放置在數(shù)據(jù)倉(cāng)庫(kù)服務(wù)器。
10 讓ETL系統(tǒng)處理工作,最小化對(duì)數(shù)據(jù)庫(kù)功能依賴(lài)。避免存儲(chǔ)過(guò)程,函數(shù)。
總結(jié)
- 上一篇: python抓取数据库_Python-7
- 下一篇: 鼎泰丰小笼包(鼎泰丰黑松露小笼包价格)