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语句该怎么优化
isnull(t2.金额,0) as 金额 , isnull(t1.是否加急,'') as 是否加急,isnull(t1.工厂,'') as 工厂
这是罪魁祸首
isnull 会全表扫描,建议去掉
1,去掉Select子句中无用的字段
2,加上where子句,不要返回无用的数据行
3,创建适当的索引
t1 t2属性 .领料单编号 建索引 (重点项)
----------------------------------------------------------------------------------
你建的索引对这个查询没有任何优化效果,两张表里“领料单编号”建索引就可以了,以下的几点建议,我觉得就不用改了。
----------------------------------------------------------------------------------
t2属性 .金额 插入数据如果为空直接填充0
t1属性 .是否加急 我看你用的字符串类型,可以改成boolean或者char(1)这种可直接运算的数据;插入数据如果为空直接填充""
t1属性 .工厂 插入数据如果为空直接填充""
原因:做一个值和null的运算 如 isnull(...) , obj is null/ obj is not null ,不会通过索引查询
1.如果可能,给字段t1和t2建立聚集索引,聚集索引快。
2.去掉isnull函数,使用cte进行二次处理实现isnull的功能
3.如果有其它的锁导致查询慢,看看是否可以使用with(nolock)
你一次性拉150万数据有什么用?这种情况下不会走索引的。