我有一个工作中的MySQL数据仓库,以星型模式组织,并使用Talend Open Studio for Data Integration 5.1创建ETL过程。我希望该过程每天运行一次。我估计一个维度表(dimUser)将有大约2百万条记录和23个列。
我在Talend中创建了一个小型测试ETL过程,但考虑到可能需要每天更新的数据量,当前性能无法满足要求。将ETL过程用于更新或插入1000条记录到dimUser需要4分钟。如果我假设记录数量和更新或插入所需时间之间存在线性关系,则ETL不可能在3-4小时内(我的期望),更别说一天。
由于我不熟悉Java,因此我将ETL编写为Python脚本,并遇到了同样的问题。尽管如此,我发现如果只插入,该过程会快得多。我相当确定瓶颈是由UPDATE语句引起的。
dimUser中的主键是自动递增整数。我的朋友建议我放弃这个主键并将其替换为多字段主键(在我的情况下是2-3个字段)。
在从我的仓库中删除测试数据并更改模式之前,是否可以提供与以下内容相关的建议或指导:
1. 数据仓库设计 2. ETL过程 3. 每天插入或更新几百万条记录的可行性 4. 我朋友的建议是否会显著有所帮助
如果您需要任何进一步的信息,请告诉我,我将发布它。
更新-附加信息:
我使用替代键是因为我读到它是一种良好的实践。从业务角度来看,我希望保持对潜在欺诈活动的警惕(例如一个用户与X州关联了200天,然后第二天与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审计目的)。
我在Talend中创建了一个小型测试ETL过程,但考虑到可能需要每天更新的数据量,当前性能无法满足要求。将ETL过程用于更新或插入1000条记录到dimUser需要4分钟。如果我假设记录数量和更新或插入所需时间之间存在线性关系,则ETL不可能在3-4小时内(我的期望),更别说一天。
由于我不熟悉Java,因此我将ETL编写为Python脚本,并遇到了同样的问题。尽管如此,我发现如果只插入,该过程会快得多。我相当确定瓶颈是由UPDATE语句引起的。
dimUser中的主键是自动递增整数。我的朋友建议我放弃这个主键并将其替换为多字段主键(在我的情况下是2-3个字段)。
在从我的仓库中删除测试数据并更改模式之前,是否可以提供与以下内容相关的建议或指导:
1. 数据仓库设计 2. ETL过程 3. 每天插入或更新几百万条记录的可行性 4. 我朋友的建议是否会显著有所帮助
如果您需要任何进一步的信息,请告诉我,我将发布它。
更新-附加信息:
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
我使用替代键是因为我读到它是一种良好的实践。从业务角度来看,我希望保持对潜在欺诈活动的警惕(例如一个用户与X州关联了200天,然后第二天与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审计目的)。