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)这三张表都是全表扫描,希望能有优化的地方
或者换一种写法,这些大表的关联该怎么操作,比较快

解决方案 »

  1.   

    看你这条语句,如果运行通过的话,至少要满足如下条件:
    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 (...);
      

  2.   

    我的建议是先删除再插入
    delete from T1 where ID in (SELECT ID2 FROM T2,T3 WHERE T2.ID = T3.ID);insert into T1 select ....merge语句内部其实是做了多次游标操作的,可以想象400万*400万的效率能有多高