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
时间函数没有利用到索引吧
#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' 的话 也是很慢很慢 换用这个函数 就很快了 问题是还有别的条件 混合一块 就很慢很慢了
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
需要具体看你的执行计划而定。 以便来说使用计算函数后,都会用扫描的。
#4
O.OrderDT<='2012-05-27' 这样如果在O.OrderDT字段上建立索引 应该不会慢的吧。
#5
“以便来说使用计算函数后,都会用扫描的。” 什么意思 会 扫描 全表吗
#6
使用视见函数会让你的查询不走索引
#7
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
问题原因找到了 ,是因为里边的子查询 的缘故 ,我把子查询的条件相关的字段也加上索引后 就很快了,还有一个问题 时间字段建了索引 为什么 datediff 还是比 between and 效率要高很多呢。
#12
数据量是不是很小?
建议楼主先执行:
SET STATISTICS TIME ON—编译时间
SET STATISTICS IO ON—物理读
然后分别执行修改前和修改后的代码,看看结果。
建议楼主先执行:
SET STATISTICS TIME ON—编译时间
SET STATISTICS IO ON—物理读
然后分别执行修改前和修改后的代码,看看结果。
#1
时间函数没有利用到索引吧
#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' 的话 也是很慢很慢 换用这个函数 就很快了 问题是还有别的条件 混合一块 就很慢很慢了
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
需要具体看你的执行计划而定。 以便来说使用计算函数后,都会用扫描的。
#4
O.OrderDT<='2012-05-27' 这样如果在O.OrderDT字段上建立索引 应该不会慢的吧。
#5
“以便来说使用计算函数后,都会用扫描的。” 什么意思 会 扫描 全表吗
#6
使用视见函数会让你的查询不走索引
#7
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
问题原因找到了 ,是因为里边的子查询 的缘故 ,我把子查询的条件相关的字段也加上索引后 就很快了,还有一个问题 时间字段建了索引 为什么 datediff 还是比 between and 效率要高很多呢。
#12
数据量是不是很小?
建议楼主先执行:
SET STATISTICS TIME ON—编译时间
SET STATISTICS IO ON—物理读
然后分别执行修改前和修改后的代码,看看结果。
建议楼主先执行:
SET STATISTICS TIME ON—编译时间
SET STATISTICS IO ON—物理读
然后分别执行修改前和修改后的代码,看看结果。