原语句如下
EXPLAIN PLAN FOR SELECT a.*, b.rkids FROM (SELECT gys.khbh, gys.khmc, wz.wzzbm, wz.wzmbm, wz.wzmc, wz.wzgg, a.sl, wz.jldw, wz.wzflmbm, a.sl * wz.wzflmbm jhje FROM wz@dblink wz, gys@dblink gys, (SELECT m.khbh, d.wzzbm, SUM(CASE m.rkzt WHEN '2' THEN d.xysl ELSE -1 * d.xysl END) sl FROM m@dblink m, d@dblink d WHERE m.rkid = d.rkid AND m.rkzt IN (2, 3) AND m.ssny < '201311' GROUP BY m.khbh, d.wzzbm) a WHERE a.sl > 0 AND gys.khbh = a.khbh AND wz.wzzbm = a.wzzbm/* and gys.khbh='00342' and wz.wzzbm='07524'*/) a, (SELECT m.khbh, d.wzzbm, wmsys.wm_concat(m.rkid) rkids FROM m@dblink m, d@dblink d WHERE m.rkid = d.rkid/* and m.khbh='00342' and d.wzzbm='07524'*/ AND m.rkzt = 2 AND m.ssny < '201311' AND m.zxdid IS NULL AND (NOT EXISTS (SELECT 1 FROM m@dblink m1, d@dblink d1 WHERE m1.rkid = d1.rkid AND m1.zxdid = m.rkid AND d1.wzzbm = d.wzzbm AND m1.rkzt = 3) OR (SELECT SUM(d1.xysl) FROM m@dblink m1, d@dblink d1 WHERE m1.rkid = d1.rkid AND m1.zxdid = m.rkid AND d1.wzzbm = d.wzzbm AND m1.rkzt = 3) < d.xysl) GROUP BY m.khbh, d.wzzbm) b WHERE a.khbh = b.khbh(+) AND a.wzzbm = b.wzzbm(+);
1 Plan hash value: 2646510213 2 3 --------------------------------------------------------------------------------------------------- 4 | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Inst |IN-OUT| 5 --------------------------------------------------------------------------------------------------- 6 | 0 | SELECT STATEMENT | | 702K| 1445M| 236 (15)| 00:00:03 | | | 7 |* 1 | HASH JOIN RIGHT OUTER| | 702K| 1445M| 236 (15)| 00:00:03 | | | 8 | 2 | VIEW | | 1 | 2018 | 128 (8)| 00:00:02 | | | 9 | 3 | SORT GROUP BY | | 1 | 67 | 128 (8)| 00:00:02 | | | 10 |* 4 | FILTER | | | | | | | | 11 | 5 | REMOTE | | 1 | 38 | 124 (7)| 00:00:02 | WN | R->S | 12 | 6 | NESTED LOOPS | | 2 | 84 | 12 (0)| 00:00:01 | | | 13 | 7 | REMOTE | MP_RKDJWZ | 8 | 128 | 4 (0)| 00:00:01 | WN | R->S | 14 | 8 | REMOTE | MP_RKDJ | 1 | 26 | 1 (0)| 00:00:01 | WN | R->S | 15 | 9 | SORT AGGREGATE | | 1 | 55 | | | | | 16 | 10 | NESTED LOOPS | | 2 | 110 | 12 (0)| 00:00:01 | | | 17 | 11 | REMOTE | MP_RKDJWZ | 8 | 232 | 4 (0)| 00:00:01 | WN | R->S | 18 | 12 | REMOTE | MP_RKDJ | 1 | 26 | 1 (0)| 00:00:01 | WN | R->S | 19 | 13 | VIEW | | 702K| 93M| 97 (16)| 00:00:02 | | | 20 | 14 | REMOTE | | | | | | WN | R->S | 21 --------------------------------------------------------------------------------------------------- 22 23 Predicate Information (identified by operation id): 24 --------------------------------------------------- 25 26 1 - access("A"."KHBH"="B"."KHBH"(+) AND "A"."WZZBM"="B"."WZZBM"(+)) 27 4 - filter( NOT EXISTS (SELECT 0 FROM "A1", "A2" WHERE "M1"."ZXDID"=:B1 AND 28 TO_NUMBER("M1"."RKZT")=3 AND "M1"."RKID"="D1"."RKID" AND "D1"."WZZBM"=:B2) OR "D"."XYSL"> 29 (SELECT SUM("D1"."XYSL") FROM "A1", "A2" WHERE "M1"."ZXDID"=:B3 AND 30 TO_NUMBER("M1"."RKZT")=3 AND "M1"."RKID"="D1"."RKID" AND "D1"."WZZBM"=:B4)) 31 32 Remote SQL Information (identified by operation id): 33 ---------------------------------------------------- 34 35 5 - SELECT "A1"."RKID","A1"."RKID","A1"."RKID","A1"."RKID","A1"."RKZT","A1"."SSNY","A1". 36 "ZXDID","A1"."KHBH","A2"."WZZBM","A2"."WZZBM","A2"."RKID","A2"."XYSL","A2"."WZZBM" FROM 37 "MP_RKDJ" "A1","MP_RKDJWZ" "A2" WHERE "A1"."RKID"="A2"."RKID" AND "A1"."ZXDID" IS NULL AND 38 TO_NUMBER("A1"."RKZT")=2 AND "A1"."SSNY"<'201311' (accessing 'WN' ) 39 40 7 - SELECT "RKID","WZZBM" FROM "MP_RKDJWZ" "A1" WHERE "WZZBM"=:1 (accessing 'WN' ) 41 42 8 - SELECT "RKID","RKZT","ZXDID" FROM "MP_RKDJ" "A2" WHERE "ZXDID"=:1 AND 43 TO_NUMBER("RKZT")=3 AND "RKID"=:2 (accessing 'WN' ) 44 45 11 - SELECT "RKID","WZZBM","XYSL" FROM "MP_RKDJWZ" "A1" WHERE "WZZBM"=:1 (accessing 'WN' 46 ) 47 48 12 - SELECT "RKID","RKZT","ZXDID" FROM "MP_RKDJ" "A2" WHERE "ZXDID"=:1 AND 49 TO_NUMBER("RKZT")=3 AND "RKID"=:2 (accessing 'WN' ) 50 51 14 - EXPLAIN PLAN INTO PLAN_TABLE@! FOR SELECT 52 "A2"."KHBH","A2"."KHMC","A3"."WZZBM","A3"."WZMBM","A3"."WZMC","A3"."WZGG","A1"."SL","A3"."J 53 LDW","A3"."WZFLMBM","A1"."SL"*TO_NUMBER("A3"."WZFLMBM") FROM "MP_WZBM" "A3","MP_GYCJDA" 54 "A2", (SELECT "A5"."KHBH" "KHBH","A4"."WZZBM" "WZZBM",SUM(CASE "A5"."RKZT" WHEN '2' THEN 55 "A4"."XYSL" ELSE (-1)*"A4"."XYSL" END ) "SL" FROM "MP_RKDJ" "A5","MP_RKDJWZ" "A4" WHERE 56 "A5"."RKID"="A4"."RKID" AND (TO_NUMBER("A5"."RKZT")=2 OR TO_NUMBER("A5"."RKZT")=3) AND 57 "A5"."SSNY"<'201311' GROUP BY "A5"."KHBH","A4"."WZZBM" HAVING SUM(CASE "A5"."RKZT" WHEN 58 '2' THEN "A4"."XYSL" ELSE (-1)*"A4"."XYSL" END )>0) "A1" WHERE "A2"."KHBH"="A1"."KHBH" AND 59 "A3"."WZZBM"="A1"."WZZBM" (accessing 'WN' )
SELECT gys.khbh, gys.khmc, wz.wzzbm, wz.wzmbm, wz.wzmc, wz.wzgg, a.sl, wz.jldw, wz.wzflmbm, a.sl * wz.wzflmbm jhje, a.rkids FROM mp_wzbm@wn wz, mp_gycjda@wn gys, (SELECT m.khbh, d.wzzbm, SUM(CASE m.rkzt WHEN '2' THEN d.xysl ELSE -1 * d.xysl END) sl, wmsys.wm_concat(CASE WHEN (m1.zxdid IS NULL OR nvl(m1.xysl, 0) < d.xysl) THEN m.rkid END) AS rkids FROM mp_rkdj@wn m INNER JOIN mp_rkdjwz@wn d ON (m.rkid = d.rkid) LEFT JOIN (SELECT SUM(d1.xysl) AS xysl, m1.zxdid, d1.wzzbm FROM mp_rkdj@wn m1, mp_rkdjwz@wn d1 WHERE m1.rkid = d1.rkid AND m1.rkzt = 3 GROUP BY m1.zxdid, d1.wzzbm) m1 ON (m1.zxdid = = m.rkid AND m1.wzzbm = d.wzzbm) WHERE m.rkzt IN (2, 3) AND m.ssny < '201311' GROUP BY m.khbh, d.wzzbm) a WHERE a.sl > 0 AND gys.khbh = a.khbh AND wz.wzzbm = a.wzzbm
改后的语句直接走了hash,这也好,省的加hint了。