MERGE INTO T1 ON USING(SELECT * FROM T2,T3 WHERE T2.ID = T3.ID) T4 ON (T1.ID2 = T4.ID2)WHEN MATCHED THEN
UPDATE SETWHEN ONT MATCHED THEN
INSERT () VALUES ();T1,T2,T3 都是大表大概 400万左右
问,上面(T1,T2,T3)这三张表都是全表扫描,希望能有优化的地方
或者换一种写法,这些大表的关联该怎么操作,比较快
UPDATE SETWHEN ONT MATCHED THEN
INSERT () VALUES ();T1,T2,T3 都是大表大概 400万左右
问,上面(T1,T2,T3)这三张表都是全表扫描,希望能有优化的地方
或者换一种写法,这些大表的关联该怎么操作,比较快
1.T4结果集中的ID2必然是唯一的,否则就会报错,这表明T2和T3存在1对1的关系
2.一般情况下,T1的ID2列是唯一的,或者ID2列重复的很少基于上述情况,全表扫描不是最佳的,最好在T2或者T3的ID列加唯一索引,在T1的ID2列建唯一或者普通索引。假设是在t1和T3上建了唯一索引,那么sql可以这么写,当然hint不是一定必要的MERGE /*+cardinality(t4 1) use_nl(t4 t1)*/ INTO T1 ON
USING(SELECT /*+ordered use_nl(t2 t3)*/ * FROM T2,T3 WHERE T2.ID = T3.ID) T4
ON (T1.ID2 = T4.ID2)
WHEN MATCHED THEN
UPDATE SET...
WHEN ONT MATCHED THEN
INSERT (...) VALUES (...);
delete from T1 where ID in (SELECT ID2 FROM T2,T3 WHERE T2.ID = T3.ID);insert into T1 select ....merge语句内部其实是做了多次游标操作的,可以想象400万*400万的效率能有多高