我有一个包含 400M+ 记录的 SCD-2 表。每天我都会获得 40M 条记录,其中约 20M 被插入和更新。我在这个项目中使用 Talend & Oracle。问题是更新这个数量的记录需要很多时间(很多小时)。我的 SCD-2 目标表结构如下:
SKEY NUMBER(38,0)
AS_OF_DATE DATE
TSTP DATE
COUNTRY VARCHAR2(2 BYTE)
RISK VARCHAR2(50 BYTE)
DATE_OF_DATA DATE
PRIMARY_COUNTRY VARCHAR2(5 BYTE)
RISK_VALUES NUMBER(8,5)
START_DATE DATE
END_DATE DATE
主键 - Skey、as_of_date、primary_country 和(每月)按 as_of_date(每日处理日期)分区。如何提高作业的性能以便能够更快地更新目标表中的记录?
我尝试在 TEMP 阶段表中插入所有要更新的数据,然后使用 MERGE 更新目标表中的记录。此外,我在阶段和目标表之间使用内部连接运行了一个更新语句,但我仍然看到性能不佳。目标表在 as_of_date 上建立索引,在 primary_country 和 end_date 上建立聚集索引。
使用的查询是:
*merge into geo_crisks_delta D
using (select as_of_date,primary_country,
skey,end_date
from geo_crisks_delta_test) T
ON
(D.as_of_date= T.as_of_date
and D.primary_country=T.primary_country
and D.skey=T.skey)
when matched then
update
set D.end_date = T.end_date
where
D.primary_country in
(select distinct country from geo_countries) and
(D.end_date=to_date('2099-12-31','yyyy-MM-dd'));*
//OR
*update
(select a.end_date as delta,b.end_date as stage
from
geo_crisks_delta a
inner join geo_crisks_delta_test b
on
a.as_of_date=b.as_of_date
and a.primary_country=b.primary_country
and a.skey=b.skey
where a.end_date=to_date('2099-12-31','yyyy-MM-dd') ) t
set t.delta=t.stage;*
我对编写存储过程的了解较少。谁能帮助我应该做些什么来改善这一点,我做错了什么?