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' 条件 慢
.tzlx_dm这个字段是字符串,是不是数据量很大,如果要提高性能,可以对.tzlx_dm它做全文索引,来提供文本查找速度
改成子查询查试试。索引,子查询…可以优化吧。如果框架支持,还可以试试hql…
@谁说海不懂天蓝 这边好像用不了hql ,子查询现在没有试过,这个我试下吧 ,看看结果怎么样
@oyljerry 对,t_zs_yzmx这个表数据量 3亿多条,我看index range scan 的cardinality 2000多万,这是不是可以理解为走这个索引要查询2000多万条数据,tzlx_dm 怎么做全文索引呢哥们? 这个现在是联合索引,我有试过删除这个联合索引,或者增加一个这个字段的单独索引都是很慢。
@谁说海不懂天蓝 试了下子查询 最后这个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 这个大表
下面为这个查询的执行计划
看了一下,说一下做一下参考;
你后面除了联表查的时候,后面所有的筛选都是在对B表做筛选,可不可以先对B表做一次筛选,在进行表的联表查操作,这样应该会减少很对的连接次数应该会对速度有提升吧,纯属个人意见,有不对的勿喷,并请指出,我也虚心受教;