merge into A
using B
ON (A.DD_PARTITION_DATE = B.DD_PARTITION_DATE
......
)
WHEN NOT MATCHED THEN
INSERT。。。。
没有update,索引全部drop掉了。每天都跑
A表是将近1亿的大表(按7天一个分区的表,),B表数据量在200万左右
A表数据量越来越大时,为什么越跑越慢,请问有什么办法提高速度吗?怎么知道分区有作用吗?这个语句每次都是B表每条数据都和A表全表比对的吗?
------解决方案--------------------
针对这个语句来说,分不分区都会将整个表拿来做hash连接
对于这样的大表,最好不要全表merge
可以分批进行,配合分区
比如a表有3个分区,DD_PARTITION_DATE 范围分别是date'2014-1-1' 到date'2014-1-31'、date'2014-2-1' 到 date'2014-2-28' 、date'2014-3-1'到date'2014-3-31'
b表的DD_PARTITION_DATE 值也在这3个范围内。分3批来merge
merge into a partition (p201301) t1
using (select * from b where b.DD_PARTITION_DATE>= ........ and b.DD_PARTITION_DATE <....) t2
on (t1.DD_PARTITION_DATE =t2.DD_PARTITION_DATE )
.................
如果分区较多,可以写个存储过程来拼接执行