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日

悬赏问题

  • ¥500 高有偿提问!求优化设计微信小程序
  • ¥15 matlab在安装时报错 无法找到入口 无法定位程序输入点
  • ¥15 收益高的广告联盟有哪些
  • ¥15 Android Studio webview 的使用问题, 播放器横屏全屏
  • ¥15 删掉jdk后重新下载,Java web所需要的eclipse无法使用
  • ¥15 uniapp正式环境中通过webapi将本地数据推送到设备出现的跨域问题
  • ¥15 xui建立节点,显示错误
  • ¥15 关于#单片机#的问题:开始、复位、十进制的功能可以实现,但是切换八进制的功能无法实现(按下按键也没有效果),把初始状态调成八进制,也是八进制可以实现但是切换到十进制不行(相关搜索:汇编语言|计数器)
  • ¥15 VINS-Mono或Fusion中feature_manager中estimated_depth是特征的深度还是逆深度?
  • ¥15 谷歌浏览器如何备份抖音网页数据