0

我有一个包含 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;*

我对编写存储过程的了解较少。谁能帮助我应该做些什么来改善这一点,我做错了什么?

4

0 回答 0