我有一个按星型模式组织的工作 MySQL 数据仓库,我正在使用 Talend Open Studio for Data Integration 5.1 创建 ETL 流程。我希望这个过程每天运行一次。我估计其中一个维度表 (dimUser) 将有大约 200 万条记录和 23 列。
我在 Talend 中创建了一个可以运行的小型测试 ETL 流程,但考虑到每天可能需要更新的数据量,当前的性能不会降低它。ETL 过程需要四分钟来更新或插入 1,000 条记录到 dimUser。如果我假设记录数与 UPDATE 或 INSERT 的时间量之间存在线性关系,那么 ETL 不可能在 3-4 小时内完成(我的希望),更不用说一天了。
由于我不熟悉 Java,我将 ETL 编写为 Python 脚本并遇到了同样的问题。虽然,我确实发现如果我只做 INSERT,这个过程会快得多。我很确定瓶颈是由 UPDATE 语句引起的。
dimUser 中的主键是一个自增整数。我的朋友建议我废弃这个主键并将其替换为多字段主键(在我的情况下,2-3 个字段)。
在我将测试数据从仓库中取出并更改架构之前,任何人都可以提供与
- 数据仓库的设计
- ETL过程
- 每天有一个 ETL 过程 INSERT 或 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 审计目的)。