需求情况是从三个不同的库取数据关联。
1、v_tjjmrhjsj@ambers_Link数据量稍大,无法预先筛选数据,且为远程数据视图。
2、ta2.tdividenddetail为本地用户同一实例下另一用户的表,数据量相对较小,可以预先筛选小数据集。
3、ppos.tworkdiary_profit@GJDFPPOS为远程数据库,数据量相对较小,可以预先筛选小数据集。
目前思路是td和tp表关联,得到较小的数据集再和t关联得到最终的结果集。
以下代码实际执行效率捉急,由于t表是远程数据视图, 默认情况下将会把数据拉到本地进行关联,时间消耗在了数据传输上,整个SQL在设计数据量下执行时间大概是2.5~3秒,。因此需要进行特定的执行计划优化。
SELECT a.c_fundcode,
a.d_cdate,
a.d_reinvestdate,
a.f_netvalue,
t.en_dwjz
from v_tjjmrhjsj@ambers_Link t,
(SELECT distinct tp.c_fundcode,
tp.d_cdate,
tp.d_reinvestdate,
td.f_netvalue
FROM ta2.tdividenddetail td,
ppos.tworkdiary_profit@GJDFPPOS tp
WHERE tp.d_reinvestdate='20201211'
and tp.c_flag <> '现金红利'
and tp.c_reviewstatus='1'
and td.c_flag = '0'
and td.c_fundcode = tp.c_fundcode
and td.D_REGDATE = tp.D_REGDATE) a
WHERE to_date(a.d_cdate,'YYYYMMDD') = t.d_rq
and a.c_fundcode = t.vc_fjjjdm
and a.f_netvalue <> t.en_dwjz
以下为加入hint优化后的代码, 在同等业务数据量下耗时0.1秒左右。
hint解释为以t视图作为"本地表", 用a集合数据来驱动t ,得到的结果集传回真正的本地。
SELECT /*+ driving_site(t) use_nl(a,t) leading(a)*/ a.c_fundcode,
a.d_cdate,
a.d_reinvestdate,
a.f_netvalue,
t.en_dwjz
from (SELECT distinct tp.c_fundcode,
tp.d_cdate,
tp.d_reinvestdate,
td.f_netvalue
FROM ta2.tdividenddetail td,
ppos.tworkdiary_profit@GJDFPPOS tp
WHERE tp.d_reinvestdate='20201211'
and tp.c_flag <> '现金红利'
and tp.c_reviewstatus='1'
and td.c_flag = '0'
and td.c_fundcode = tp.c_fundcode
and td.D_REGDATE = tp.D_REGDATE) a,
v_tjjmrhjsj@ambers_Link t
WHERE to_date(a.d_cdate,'YYYYMMDD') = t.d_rq
and a.c_fundcode = t.vc_fjjjdm
and a.f_netvalue <> t.en_dwjz