描述:
GBase南大通用8a如下 7 张表关联的 sql
Select … from c_mp cm,
arc_e_mp_para_snap am,
arc_e_consprc_snap aep,
arc_e_cons_prc_amt aecp,
arc_e_mp_pq acmpq,
e_cat_prc ecp,
e_cat_prc_det ecpd
where cm.mp_id = am.mp_id
and cm.org_no = am.org_no
and am.calc_id = aep.calc_id
and am.prc_id = aep.prc_id
and am.org_no = aep.org_no
and aecp.prc_snap_id = aep.prc_snap_id
and aecp.org_no = aep.org_no
and ecp.prc_code = aecp.prc_code
and ecp.para_vn = aecp.para_vn
and acmpq.mp_para_snap_id = am.mp_para_snap_id and acmpq.org_no = am.org_no
and ecp.cat_prc_id = ecpd.cat_prc_id
and ecp.org_no = ecpd.org_no
and acmpq.prc_ts_code = ecpd.prc_ti_code
and am.org_no = ‘2140400’
GBase南大通用8a各表数据量如下:
表名 记录数
c_mp 20272978
arc_e_mp_para_snap 555244914 arc_e_consprc_snap 555759300
arc_e_cons_prc_amt 555517631 arc_e_mp_pq 573320532 e_cat_prc 3222
e_cat_prc_det 9282
GBase南大通用8a整个 sql 执行过程中由于不是最优关联顺序,导致产生中间结果集 50 多 G,虽然单条执行速 度可接受,但是在并发是该 sql 产生的中间结果集是不可接受的(几百 G 接近上 T),整个 过程全是磁盘的读写等待。
GBase南大通用8a解决办法:
分析出表的最优关联顺序,进行了强制改写后,单条 sql 产生的结果集不到 1G,执行时间能 缩短,且能顺利完成并发。改写如下:
Select … from (select ecp.cat_prc_id, ecpd.prc_ti_code,
t2.mp_para_snap_id,
t2.org_no
from (select aecp.prc_code,
aecp.para_vn, t1.mp_para_snap_id, t1.org_no
from (select aep.prc_snap_id, am.mp_para_snap_id,
am.org_no
from arc_e_mp_para_snap am, – 5 亿的表,但可有效过滤
arc_e_consprc_snap aep, – 5 亿的表
c_mp cm – 200 万 where am.calc_id = aep.calc_id
and am.prc_id = aep.prc_id and am.org_no = aep.org_no and am.org_no = ‘2140400’ and am.ym = ‘201301’
and cm.mp_id = am.mp_id
and cm.org_no = am.org_no) t1, --首先三表关联生成 T1 arc_e_cons_prc_amt aecp
where aecp.prc_snap_id = t1.prc_snap_id
and aecp.org_no = t1.org_no) t2, – T1 是小表,和大表关联生成 T2
e_cat_prc ecp,
e_cat_prc_det ecpd
where ecp.prc_code = t2.prc_codeGBase南大通用8aGBase南大通用8aGBase南大通用8aGBase南大通用8a
and ecp.para_vn = t2.para_vn
and ecp.cat_prc_id = ecpd.cat_prc_id) t3, – t2 和两个小表关联,生成 T3
arc_e_mp_pq acmpq – 使 T3 和 5 亿的表关联 where acmpq.prc_ts_code = t3.prc_ti_code
and acmpq.mp_para_snap_id = t3.mp_para_snap_id
and acmpq.org_no = t3.org_no;