weixin_46724576 2020-11-27 17:30 采纳率: 100%
浏览 89
已结题

GBase 8a的多表关联时,执行计划有时不能按照最优关联顺序进行关联

在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'
各表数据量如下:
表名 记录数
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 
整个sql执行过程中由于不是最优关联顺序,导致产生中间结果集50多G,虽然单条执行速度可接受,但是在并发是该sql产生的中间结果集是不可接受的(几百G接近上T),整个过程全是磁盘的读写等待。

  • 写回答

1条回答 默认 最新

  • 生命之源; 2020-11-30 14:21
    关注

    分析出表的最优关联顺序,进行了强制改写后,单条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_code
                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;

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月7日
  • 已采纳回答 11月29日

悬赏问题

  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 LiBeAs的带隙等于0.997eV,计算阴离子的N和P
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 来真人,不要ai!matlab有关常微分方程的问题求解决,
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算