我有一個工作的MySQL數據倉庫,它被組織爲一個星型模式,我使用Talend Open Studio for Data Integration 5.1來創建ETL過程。我希望這個過程每天運行一次。我估計其中一個維度表(dimUser)將有大約200萬條記錄和23列。數據倉庫ETL緩慢更改維度中的主鍵?
我在Talend中創建了一個小測試ETL過程,但是由於可能需要每天更新的數據量,當前性能不會削減它。它需要ETL過程四分鐘來更新或將1,000條記錄插入dimUser。如果我假設記錄計數與更新或插入的時間之間存在線性關係,那麼ETL無法在3-4小時內完成(我的希望),更不用說有一天了。
因爲我不熟悉Java,所以我將ETL編寫爲Python腳本並遇到了同樣的問題。雖然,我確實發現,如果我只進行了INSERT,流程就會更快。我很確定這個瓶頸是由UPDATE語句引起的。
dimUser中的主鍵是一個自動遞增整數。我的朋友建議我放棄這個主鍵,並用多字段主鍵替換它(在我的情況下,2-3個字段)。
之前,我撕裂測試數據出來我的倉庫和更改架構,任何人都可以提供與
- 數據倉庫
- ETL過程的設計建議或指引
- 多麼逼真就是每天有一個ETL進程插入或更新幾百萬條記錄
- 我朋友的建議會大大幫助
如果您需要更多信息,請讓我知道,我會發布它。
UPDATE - 其他信息:
mysql> describe dimUser;
Field Type Null Key Default Extra
user_key int(10) unsigned NO PRI NULL auto_increment
id_A int(10) unsigned NO NULL
id_B int(10) unsigned NO NULL
field_4 tinyint(4) unsigned NO 0
field_5 varchar(50) YES NULL
city varchar(50) YES NULL
state varchar(2) YES NULL
country varchar(50) YES NULL
zip_code varchar(10) NO 99999
field_10 tinyint(1) NO 0
field_11 tinyint(1) NO 0
field_12 tinyint(1) NO 0
field_13 tinyint(1) NO 1
field_14 tinyint(1) NO 0
field_15 tinyint(1) NO 0
field_16 tinyint(1) NO 0
field_17 tinyint(1) NO 1
field_18 tinyint(1) NO 0
field_19 tinyint(1) NO 0
field_20 tinyint(1) NO 0
create_date datetime NO 2012-01-01 00:00:00
last_update datetime NO 2012-01-01 00:00:00
run_id int(10) unsigned NO 999
我使用代理鍵,因爲我讀了,這是很好的做法。因爲從商業的角度來看,我想要知道潛在的欺詐活動(比如說200天的用戶與X狀態相關聯,然後第二天他們與Y狀態相關聯 - 他們可能已經移動了,或者他們的賬戶可能已經妥協),所以這就是地理數據保存的原因。字段id_B可能有一些與它關聯的id_A的不同值,但我有興趣瞭解不同的(id_A,id_B)元組。在這個信息的背景下,我的朋友建議像(id_A,id_B,zip_code)這樣的主鍵。對於絕大多數日常ETL過程(> 80%),我只希望爲現有記錄更新以下字段:field_10 - field_14,last_update和run_id(該字段是我的etlLog表的外鍵並用於ETL審計目的)。
如果您將主鍵更改爲在更新過程中可能更改的內容,那麼每次更新索引時都需要重新計算索引,速度會更慢。看起來很奇怪的是,在中等大小的表上更新只有100行需要4分鐘,可能是您的腳本存在問題,而不是架構。你有沒有嘗試過直接在你的腳本中使用sql比較基準更新? – limscoder
你是怎麼每天想到幾百萬的? –
你的鑰匙是好的,你在加載時使用密鑰管道嗎? dimuser上的商業關鍵是什麼? –