读书人

Oracle大数据量增量更新有关问题

发布时间: 2013-01-11 11:57:35 作者: rapoo

Oracle大数据量增量更新问题
现在有这样一种情况,源表数据量1000W,或者更大,属于总表,增量表数据量百万级别,要求把增量表数据更新到源表中。
我采用的是MERGE语句,根据条件判断是insert还是update,增量表300W的时候且全走UPDATE分支时,执行不动了,请问增量更新还有什么更好的方案?


MERGE INTO MDA_订单_100M
USING MDA_订单_100M_TEMP
ON ( MDA_订单_100M.产品 = MDA_订单_100M_TEMP.产品
AND MDA_订单_100M.货主城市 = MDA_订单_100M_TEMP.货主城市
AND MDA_订单_100M.货主地区 = MDA_订单_100M_TEMP.货主地区
AND MDA_订单_100M.运货商 = MDA_订单_100M_TEMP.运货商
AND MDA_订单_100M.发货日期 = MDA_订单_100M_TEMP.发货日期
AND MDA_订单_100M.到货日期 = MDA_订单_100M_TEMP.到货日期
AND MDA_订单_100M.订购日期 = MDA_订单_100M_TEMP.订购日期
AND MDA_订单_100M.客户 = MDA_订单_100M_TEMP.客户
AND MDA_订单_100M.雇员 = MDA_订单_100M_TEMP.雇员
AND 1 = 1 )
WHEN MATCHED THEN
UPDATE SET MDA_订单_100M.订购数量_sum = MDA_订单_100M.订购数量_sum + MDA_订单_100M_TEMP.订购数量_sum,
MDA_订单_100M.订购数量_count = MDA_订单_100M.订购数量_count + MDA_订单_100M_TEMP.订购数量_count,
MDA_订单_100M.订购数量_avg = ( MDA_订单_100M.订购数量_avg * MDA_订单_100M.订购数量_count + MDA_订单_100M_TEMP.订购数量_avg * MDA_订单_100M_TEMP.订购数量_count ) / ( MDA_订单_100M.订购数量_count + MDA_订单_100M_TEMP.订购数量_count ),
MDA_订单_100M.订购数量_max = CASE
WHEN MDA_订单_100M.订购数量_max >= MDA_订单_100M_TEMP.订购数量_max THEN MDA_订单_100M.订购数量_max
ELSE MDA_订单_100M_TEMP.订购数量_max
END,
MDA_订单_100M.订购数量_min = CASE
WHEN MDA_订单_100M.订购数量_min <= MDA_订单_100M_TEMP.订购数量_min THEN MDA_订单_100M.订购数量_min
ELSE MDA_订单_100M_TEMP.订购数量_min
END,
MDA_订单_100M.单价_sum = MDA_订单_100M.单价_sum + MDA_订单_100M_TEMP.单价_sum,
MDA_订单_100M.单价_count = MDA_订单_100M.单价_count + MDA_订单_100M_TEMP.单价_count,


MDA_订单_100M.单价_avg = ( MDA_订单_100M.单价_avg * MDA_订单_100M.单价_count + MDA_订单_100M_TEMP.单价_avg * MDA_订单_100M_TEMP.单价_count ) / ( MDA_订单_100M.单价_count + MDA_订单_100M_TEMP.单价_count ),
MDA_订单_100M.单价_max = CASE
WHEN MDA_订单_100M.单价_max >= MDA_订单_100M_TEMP.单价_max THEN MDA_订单_100M.单价_max
ELSE MDA_订单_100M_TEMP.单价_max
END,
MDA_订单_100M.单价_min = CASE
WHEN MDA_订单_100M.单价_min <= MDA_订单_100M_TEMP.单价_min THEN MDA_订单_100M.单价_min
ELSE MDA_订单_100M_TEMP.单价_min
END,
MDA_订单_100M.运货费_sum = MDA_订单_100M.运货费_sum + MDA_订单_100M_TEMP.运货费_sum,
MDA_订单_100M.运货费_count = MDA_订单_100M.运货费_count + MDA_订单_100M_TEMP.运货费_count,
MDA_订单_100M.运货费_avg = ( MDA_订单_100M.运货费_avg * MDA_订单_100M.运货费_count + MDA_订单_100M_TEMP.运货费_avg * MDA_订单_100M_TEMP.运货费_count ) / ( MDA_订单_100M.运货费_count + MDA_订单_100M_TEMP.运货费_count ),
MDA_订单_100M.运货费_max = CASE
WHEN MDA_订单_100M.运货费_max >= MDA_订单_100M_TEMP.运货费_max THEN MDA_订单_100M.运货费_max
ELSE MDA_订单_100M_TEMP.运货费_max
END,
MDA_订单_100M.运货费_min = CASE
WHEN MDA_订单_100M.运货费_min <= MDA_订单_100M_TEMP.运货费_min THEN MDA_订单_100M.运货费_min


ELSE MDA_订单_100M_TEMP.运货费_min
END,
MDA_订单_100M.订单ID_sum = MDA_订单_100M.订单ID_sum + MDA_订单_100M_TEMP.订单ID_sum,
MDA_订单_100M.订单ID_count = MDA_订单_100M.订单ID_count + MDA_订单_100M_TEMP.订单ID_count,
MDA_订单_100M.订单ID_avg = ( MDA_订单_100M.订单ID_avg * MDA_订单_100M.订单ID_count + MDA_订单_100M_TEMP.订单ID_avg * MDA_订单_100M_TEMP.订单ID_count ) / ( MDA_订单_100M.订单ID_count + MDA_订单_100M_TEMP.订单ID_count ),
MDA_订单_100M.订单ID_max = CASE
WHEN MDA_订单_100M.订单ID_max >= MDA_订单_100M_TEMP.订单ID_max THEN MDA_订单_100M.订单ID_max
ELSE MDA_订单_100M_TEMP.订单ID_max
END,
MDA_订单_100M.订单ID_min = CASE
WHEN MDA_订单_100M.订单ID_min <= MDA_订单_100M_TEMP.订单ID_min THEN MDA_订单_100M.订单ID_min
ELSE MDA_订单_100M_TEMP.订单ID_min
END
WHEN NOT MATCHED THEN
INSERT (MDA_订单_100M.产品,
MDA_订单_100M.货主城市,
MDA_订单_100M.货主地区,
MDA_订单_100M.运货商,
MDA_订单_100M.发货日期,
MDA_订单_100M.到货日期,
MDA_订单_100M.订购日期,
MDA_订单_100M.客户,
MDA_订单_100M.雇员,
MDA_订单_100M.订购数量_sum,
MDA_订单_100M.订购数量_count,
MDA_订单_100M.订购数量_avg,


MDA_订单_100M.订购数量_max,
MDA_订单_100M.订购数量_min,
MDA_订单_100M.单价_sum,
MDA_订单_100M.单价_count,
MDA_订单_100M.单价_avg,
MDA_订单_100M.单价_max,
MDA_订单_100M.单价_min,
MDA_订单_100M.运货费_sum,
MDA_订单_100M.运货费_count,
MDA_订单_100M.运货费_avg,
MDA_订单_100M.运货费_max,
MDA_订单_100M.运货费_min,
MDA_订单_100M.订单ID_sum,
MDA_订单_100M.订单ID_count,
MDA_订单_100M.订单ID_avg,
MDA_订单_100M.订单ID_max,
MDA_订单_100M.订单ID_min)
VALUES(MDA_订单_100M_TEMP.产品,
MDA_订单_100M_TEMP.货主城市,
MDA_订单_100M_TEMP.货主地区,
MDA_订单_100M_TEMP.运货商,
MDA_订单_100M_TEMP.发货日期,
MDA_订单_100M_TEMP.到货日期,
MDA_订单_100M_TEMP.订购日期,
MDA_订单_100M_TEMP.客户,
MDA_订单_100M_TEMP.雇员,
MDA_订单_100M_TEMP.订购数量_sum,
MDA_订单_100M_TEMP.订购数量_count,
MDA_订单_100M_TEMP.订购数量_avg,
MDA_订单_100M_TEMP.订购数量_max,
MDA_订单_100M_TEMP.订购数量_min,
MDA_订单_100M_TEMP.单价_sum,
MDA_订单_100M_TEMP.单价_count,
MDA_订单_100M_TEMP.单价_avg,
MDA_订单_100M_TEMP.单价_max,
MDA_订单_100M_TEMP.单价_min,
MDA_订单_100M_TEMP.运货费_sum,
MDA_订单_100M_TEMP.运货费_count,
MDA_订单_100M_TEMP.运货费_avg,
MDA_订单_100M_TEMP.运货费_max,
MDA_订单_100M_TEMP.运货费_min,
MDA_订单_100M_TEMP.订单ID_sum,
MDA_订单_100M_TEMP.订单ID_count,
MDA_订单_100M_TEMP.订单ID_avg,
MDA_订单_100M_TEMP.订单ID_max,
MDA_订单_100M_TEMP.订单ID_min)


------解决方案--------------------


源表按订单时间建分区表应好些
[解决办法]
分成两部分,先从增量表插入源表没有的数据,再更新源表数据,先用备份的源表试试,最后要测试源表是否已经完全包含了增量表的数据。
[解决办法]
对于大数据走Merge是很痛苦的,因为相当于是多次二维循环了。这中间可能导致Undo空间不足的现象。
试试看先将旧表和新表进行关联插入到一个表中,不要用临时表。
再将原先旧表改名,新插表改回旧表的方式。
[解决办法]
你先将已存在的数据删除,再插入数据呢.
你表上针对更新条件建立索引没有,我觉得还是查询慢才造成你更新不动的。
[解决办法]
应该是 是更新的 条件问题导致的 很慢,如楼上所说 ,把把更新条件建立索引 然后用执行计划看看 建索引前后的 效率

读书人网 >oracle

热点推荐