u014785219
sherq1989
采纳率0%
2017-05-22 10:30

求助:一个sql执行非常缓慢,通过执行计划怎么能优化下

  • sql

sql如下 如果不加最后一个条件and b.tzlx_dm = '00' 执行的非常快,但是如果加上之后 执行很长时间没有反应,具体的执行计划在下面,第一个没有 b.tzlx_dm = '00' 条件的(快)。 第二个有 b.tzlx_dm = '00' 条件的(慢)。
请教大神们的帮助,谢谢
SELECT nsr.nsrsbh, nsr.nsrmc, nsr.djxh, nsr.nsrzt_dm, nsr.djzclx_dm, nsr.zgswj_dm, '0' as zgxtbz
FROM db_zgxt.t_dj_jgnsr a,
db_zgxt.t_zs_yzmx b,
dm_gy_zsxmpm d,
dj_nsrxx nsr
where a.nsrnbm = b.nsrnbm
and a.nsrbm = nsr.nsrbm
and b.zsxm_dm = d.old_dm
and b.zspm_dm = d.old_dm1
and b.zf_bj = '0'
and b.ykp_bj = '0'
and b.yzsf_je > 0
-- and b.tzlx_dm = '00'

无 b.tzlx_dm = '00' 条件 快
图片说明

有 b.tzlx_dm = '00' 条件 慢
图片说明

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

6条回答

  • qq_32132157 Zane_zz 4年前

    看了一下,说一下做一下参考;
    你后面除了联表查的时候,后面所有的筛选都是在对B表做筛选,可不可以先对B表做一次筛选,在进行表的联表查操作,这样应该会减少很对的连接次数应该会对速度有提升吧,纯属个人意见,有不对的勿喷,并请指出,我也虚心受教;

    点赞 评论 复制链接分享
  • u014785219 sherq1989 4年前

    @谁说海不懂天蓝 试了下子查询 最后这个and b.tzlx_dm = '00' 条件 我改为
    and exists (select e.nsrbm from db_zgxt.t_zs_yzmx e where e.nsrnbm=a.nsrnbm and e.tzlx_dm='00') 其余保持不变, 现在查询就快多了,几乎秒查
    这个不太理解为什么这样写就快了呢 还加了一个t_zs_yzmx 这个大表
    下面为这个查询的执行计划
    图片说明

    点赞 评论 复制链接分享
  • u014785219 sherq1989 4年前

    @oyljerry 对,t_zs_yzmx这个表数据量 3亿多条,我看index range scan 的cardinality 2000多万,这是不是可以理解为走这个索引要查询2000多万条数据,tzlx_dm 怎么做全文索引呢哥们? 这个现在是联合索引,我有试过删除这个联合索引,或者增加一个这个字段的单独索引都是很慢。

    点赞 评论 复制链接分享
  • u014785219 sherq1989 4年前

    @谁说海不懂天蓝 这边好像用不了hql ,子查询现在没有试过,这个我试下吧 ,看看结果怎么样

    点赞 评论 复制链接分享
  • qq_28639045 谁说海不懂天蓝 4年前

    改成子查询查试试。索引,子查询…可以优化吧。如果框架支持,还可以试试hql…

    点赞 评论 复制链接分享
  • oyljerry oyljerry 4年前

    .tzlx_dm这个字段是字符串,是不是数据量很大,如果要提高性能,可以对.tzlx_dm它做全文索引,来提供文本查找速度

    点赞 评论 复制链接分享

相关推荐