sql 查询条件 加个时间筛选条件会很慢

时间:2021-10-18 22:29:50
 WHERE datediff(dd,'2012-05-24',O.OrderDT) >= 0 AND datediff(dd,'2012-05-27',O.OrderDT)<= 0
 AND datediff(dd,'2012-05-24',O.PayDt) >= 0 AND datediff(dd,'2012-05-27',O.PayDt)<= 0  and 
  charindex('0',O.IsReceive) = 1    AND charindex('5',O.State)=0   
  上面是我的查询条件  去掉时间条件 或者 只保留时间条件 都查询很快 两三秒钟 就出来全部结果了 
但是  用上面所有条件查询 几分钟都出不来结果 
 请问 各位大侠 是什么原因呢

12 个解决方案

#1


时间函数没有利用到索引吧

sql 查询条件 加个时间筛选条件会很慢 

#2


datediff(dd,'2012-05-24',O.OrderDT) >= 0 AND datediff(dd,'2012-05-27',O.OrderDT)<= 0
 AND datediff(dd,'2012-05-24',O.PayDt) >= 0 AND datediff(dd,'2012-05-27',O.PayDt)<= 0
用 datediff 这个函数 是不是相当于建了个索引呢 因为 我直接用 O.OrderDT<='2012-05-27' 的话 也是很慢很慢 换用这个函数 就很快了 问题是还有别的条件 混合一块 就很慢很慢了

#3


引用 2 楼  的回复:
datediff(dd,'2012-05-24',O.OrderDT) >= 0 AND datediff(dd,'2012-05-27',O.OrderDT)<= 0
 AND datediff(dd,'2012-05-24',O.PayDt) >= 0 AND datediff(dd,'2012-05-27',O.PayDt)<= 0
用 datediff 这个函数 是不是相当于建了个索……


需要具体看你的执行计划而定。 以便来说使用计算函数后,都会用扫描的。

#4


 O.OrderDT<='2012-05-27'  这样如果在O.OrderDT字段上建立索引 应该不会慢的吧。

#5


“以便来说使用计算函数后,都会用扫描的。” 什么意思 会 扫描 全表吗

#6


引用 2 楼  的回复:
datediff(dd,'2012-05-24',O.OrderDT) >= 0 AND datediff(dd,'2012-05-27',O.OrderDT)<= 0
 AND datediff(dd,'2012-05-24',O.PayDt) >= 0 AND datediff(dd,'2012-05-27',O.PayDt)<= 0
用 datediff 这个函数 是不是相当于建了个索……


使用视见函数会让你的查询不走索引

#7


引用 5 楼  的回复:
“以便来说使用计算函数后,都会用扫描的。” 什么意思 会 扫描 全表吗


Ctrl +L 看一下执行计划,如果用到计算的函数,基本上末端都是index scan 或者是table scan.
如果应用到索引,应该是index seek等。

#8


嗯,datediff 和  charindex 都是“聚集索引扫描”,而且我表里这几列都没有建索引 那为什么时间条件跟其他条件结合后 查询那么慢呢

#9


建了索引跟没建索引 一样的效果 , 去掉时间条件 或者 只保留时间条件 都查询很快 两三秒钟 就出来全部结果了  
但是 用上面所有条件查询 几分钟都出不来结果  

#10


建立了OrderDT, PayDt 索引后:

where 1=1
and O.OrderDT between '2012-05-24' AND '2012-05-27 23:59:59.997'
and O.PayDt between '2012-05-24' AND '2012-05-27 23:59:59.997'
..

应该能利用上索引

#11


引用 9 楼  的回复:
建了索引跟没建索引 一样的效果 , 去掉时间条件 或者 只保留时间条件 都查询很快 两三秒钟 就出来全部结果了  
但是 用上面所有条件查询 几分钟都出不来结果


问题原因找到了 ,是因为里边的子查询 的缘故 ,我把子查询的条件相关的字段也加上索引后 就很快了,还有一个问题 时间字段建了索引 为什么 datediff 还是比 between and  效率要高很多呢。

#12


数据量是不是很小?
建议楼主先执行:
SET STATISTICS TIME ON—编译时间
SET STATISTICS IO ON—物理读
然后分别执行修改前和修改后的代码,看看结果。

#1


时间函数没有利用到索引吧

sql 查询条件 加个时间筛选条件会很慢 

#2


datediff(dd,'2012-05-24',O.OrderDT) >= 0 AND datediff(dd,'2012-05-27',O.OrderDT)<= 0
 AND datediff(dd,'2012-05-24',O.PayDt) >= 0 AND datediff(dd,'2012-05-27',O.PayDt)<= 0
用 datediff 这个函数 是不是相当于建了个索引呢 因为 我直接用 O.OrderDT<='2012-05-27' 的话 也是很慢很慢 换用这个函数 就很快了 问题是还有别的条件 混合一块 就很慢很慢了

#3


引用 2 楼  的回复:
datediff(dd,'2012-05-24',O.OrderDT) >= 0 AND datediff(dd,'2012-05-27',O.OrderDT)<= 0
 AND datediff(dd,'2012-05-24',O.PayDt) >= 0 AND datediff(dd,'2012-05-27',O.PayDt)<= 0
用 datediff 这个函数 是不是相当于建了个索……


需要具体看你的执行计划而定。 以便来说使用计算函数后,都会用扫描的。

#4


 O.OrderDT<='2012-05-27'  这样如果在O.OrderDT字段上建立索引 应该不会慢的吧。

#5


“以便来说使用计算函数后,都会用扫描的。” 什么意思 会 扫描 全表吗

#6


引用 2 楼  的回复:
datediff(dd,'2012-05-24',O.OrderDT) >= 0 AND datediff(dd,'2012-05-27',O.OrderDT)<= 0
 AND datediff(dd,'2012-05-24',O.PayDt) >= 0 AND datediff(dd,'2012-05-27',O.PayDt)<= 0
用 datediff 这个函数 是不是相当于建了个索……


使用视见函数会让你的查询不走索引

#7


引用 5 楼  的回复:
“以便来说使用计算函数后,都会用扫描的。” 什么意思 会 扫描 全表吗


Ctrl +L 看一下执行计划,如果用到计算的函数,基本上末端都是index scan 或者是table scan.
如果应用到索引,应该是index seek等。

#8


嗯,datediff 和  charindex 都是“聚集索引扫描”,而且我表里这几列都没有建索引 那为什么时间条件跟其他条件结合后 查询那么慢呢

#9


建了索引跟没建索引 一样的效果 , 去掉时间条件 或者 只保留时间条件 都查询很快 两三秒钟 就出来全部结果了  
但是 用上面所有条件查询 几分钟都出不来结果  

#10


建立了OrderDT, PayDt 索引后:

where 1=1
and O.OrderDT between '2012-05-24' AND '2012-05-27 23:59:59.997'
and O.PayDt between '2012-05-24' AND '2012-05-27 23:59:59.997'
..

应该能利用上索引

#11


引用 9 楼  的回复:
建了索引跟没建索引 一样的效果 , 去掉时间条件 或者 只保留时间条件 都查询很快 两三秒钟 就出来全部结果了  
但是 用上面所有条件查询 几分钟都出不来结果


问题原因找到了 ,是因为里边的子查询 的缘故 ,我把子查询的条件相关的字段也加上索引后 就很快了,还有一个问题 时间字段建了索引 为什么 datediff 还是比 between and  效率要高很多呢。

#12


数据量是不是很小?
建议楼主先执行:
SET STATISTICS TIME ON—编译时间
SET STATISTICS IO ON—物理读
然后分别执行修改前和修改后的代码,看看结果。