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

che 2012-05-28 03:54:53
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
上面是我的查询条件 去掉时间条件 或者 只保留时间条件 都查询很快 两三秒钟 就出来全部结果了
但是 用上面所有条件查询 几分钟都出不来结果
请问 各位大侠 是什么原因呢
...全文
3318 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
gogodiy 2012-05-29
  • 打赏
  • 举报
回复
数据量是不是很小?
建议楼主先执行:
SET STATISTICS TIME ON—编译时间
SET STATISTICS IO ON—物理读
然后分别执行修改前和修改后的代码,看看结果。
che 2012-05-29
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

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

问题原因找到了 ,是因为里边的子查询 的缘故 ,我把子查询的条件相关的字段也加上索引后 就很快了,还有一个问题 时间字段建了索引 为什么 datediff 还是比 between and 效率要高很多呢。
tim_spac_126 2012-05-28
  • 打赏
  • 举报
回复
建立了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'
..

应该能利用上索引
che 2012-05-28
  • 打赏
  • 举报
回复
建了索引跟没建索引 一样的效果 , 去掉时间条件 或者 只保留时间条件 都查询很快 两三秒钟 就出来全部结果了
但是 用上面所有条件查询 几分钟都出不来结果
che 2012-05-28
  • 打赏
  • 举报
回复
嗯,datediff 和 charindex 都是“聚集索引扫描”,而且我表里这几列都没有建索引 那为什么时间条件跟其他条件结合后 查询那么慢呢
Mr_Nice 2012-05-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

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

Ctrl +L 看一下执行计划,如果用到计算的函数,基本上末端都是index scan 或者是table scan.
如果应用到索引,应该是index seek等。
  • 打赏
  • 举报
回复
[Quote=引用 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 这个函数 是不是相当于建了个索……
[/Quote]

使用视见函数会让你的查询不走索引
che 2012-05-28
  • 打赏
  • 举报
回复
“以便来说使用计算函数后,都会用扫描的。” 什么意思 会 扫描 全表吗
--小F-- 2012-05-28
  • 打赏
  • 举报
回复
O.OrderDT<='2012-05-27' 这样如果在O.OrderDT字段上建立索引 应该不会慢的吧。
Mr_Nice 2012-05-28
  • 打赏
  • 举报
回复
[Quote=引用 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 这个函数 是不是相当于建了个索……
[/Quote]

需要具体看你的执行计划而定。 以便来说使用计算函数后,都会用扫描的。
che 2012-05-28
  • 打赏
  • 举报
回复
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' 的话 也是很慢很慢 换用这个函数 就很快了 问题是还有别的条件 混合一块 就很慢很慢了
--小F-- 2012-05-28
  • 打赏
  • 举报
回复
时间函数没有利用到索引吧

22,301

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧