首页 新闻 会员 周边 捐助

下面的SQL语句查询太慢,该怎么优化?有150万条数据,耗时30秒

0
[待解决问题]
SELECT     t1.ID,t1.外发单号, t1.领料单编号, t1.领料部门, t1.发料仓库, 
           t1.日期, t1.领料人, t1.发料人, t1.制单人, 
           t1.红冲, t1.开单日期, t1.FlagColumn, t2.订单流水号, 
           t2.货号, t2.物料代号, t2.物料名称, 
           t2.计量单位, t2.应发数量, t2.实发数量, 
           t2.仓位, t2.备注, t2.修改人, 
           t2.修改时间, isnull(t2.金额,0) as 金额
                      , isnull(t1.是否加急,'') as 是否加急,isnull(t1.工厂,'') as 工厂
FROM         t1 INNER JOIN
             t2 ON t1.领料单编号 = t2.领料单编号

我在t1和t2的单号上都加了非聚集索引,但是没效果 请问这个SQL语句该怎么优化

JaneEyreWork的主页 JaneEyreWork | 初学一级 | 园豆:11
提问于:2016-09-23 11:09
< >
分享
所有回答(6)
0

isnull(t2.金额,0) as 金额 , isnull(t1.是否加急,'') as 是否加急,isnull(t1.工厂,'') as 工厂

这是罪魁祸首

爱编程的大叔 | 园豆:30844 (高人七级) | 2016-09-23 11:13
0

isnull 会全表扫描,建议去掉

程序新青年 | 园豆:841 (小虾三级) | 2016-09-23 11:15
0

1,去掉Select子句中无用的字段

2,加上where子句,不要返回无用的数据行

3,创建适当的索引

悦光阴 | 园豆:2251 (老鸟四级) | 2016-09-23 12:36
0

t1 t2属性  .领料单编号  建索引  (重点项)

----------------------------------------------------------------------------------

你建的索引对这个查询没有任何优化效果,两张表里“领料单编号”建索引就可以了,以下的几点建议,我觉得就不用改了。

----------------------------------------------------------------------------------

t2属性  .金额 插入数据如果为空直接填充0

t1属性  .是否加急 我看你用的字符串类型,可以改成boolean或者char(1)这种可直接运算的数据;插入数据如果为空直接填充""

t1属性  .工厂 插入数据如果为空直接填充""

原因:做一个值和null的运算  如 isnull(...) , obj is null/ obj is not null ,不会通过索引查询

 

牧师/preacher | 园豆:500 (菜鸟二级) | 2016-09-23 13:45
0

1.如果可能,给字段t1和t2建立聚集索引,聚集索引快。

2.去掉isnull函数,使用cte进行二次处理实现isnull的功能

3.如果有其它的锁导致查询慢,看看是否可以使用with(nolock)

空明流光 | 园豆:111 (初学一级) | 2016-09-23 17:15
0

你一次性拉150万数据有什么用?这种情况下不会走索引的。

Daniel Cai | 园豆:10424 (专家六级) | 2016-09-26 10:03
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册