Sql2005诡异的查询,4百多条记录比2万条记录花费的时间还长??

我在深圳搬砖-Justin 2009-11-18 11:01:06

select * from ..... a.creadate >= '2009-10-1 00:00:00' and a.creadate <= '2009-11-18 23:59:59'
--496条,30秒
select * from ..... a.creadate >= '2009-1-1 00:00:00' and a.creadate<= '2009-11-18 23:59:59'
--20735,2秒


前面是 ...... 是几个表的连接查询
不知道为什么,查询时间,只要月份不是小于10的查询速度就超级慢

...全文
234 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 lishq2008 的回复:]
这两个查询是对同一张表吗?如果不是请检查是否建立了索引。
你好象说第一个查询是几张表关联,那肯定比第二个慢啦。
还有得到结果集大小,不是查询快慢的原因。数据表大小才是关键。
[/Quote]

兩句sql查詢 就后面的條件時間不一樣,其它一模一樣

[Quote=引用 22 楼 szaf31954 的回复:]
按你说的第一个是多表关联的查询那肯定就会慢咯
建立索引的话会好一些的
[/Quote]
索引已經有。。。。都是兩句都是多表關聯

[Quote=引用 25 楼 shunruo 的回复:]
把时间字串转换成DATE型变量进行比较试试
//select * from .....  a.creadate >= '2009-10-1 00:00:00'  and a.creadate <= '2009-//11-18 23:59:59'

select * from .....  a.creadate BETWEEN 40087.0 AND 40135.999988

[/Quote]
試試先
icemanpro 2009-11-19
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 jijunwu 的回复:]
引用 25 楼 shunruo 的回复:
把时间字串转换成DATE型变量进行比较试试
//select * from .....  a.creadate >= '2009-10-1 00:00:00'  and a.creadate <= '2009-//11-18 23:59:59'

select * from .....  a.creadate BETWEEN 40087.0 AND 40135.999988



晕。。sql  里面有Date型变量吗?
[/Quote]

2008中有
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 shunruo 的回复:]
把时间字串转换成DATE型变量进行比较试试
//select * from .....  a.creadate >= '2009-10-1 00:00:00'  and a.creadate <= '2009-//11-18 23:59:59'

select * from .....  a.creadate BETWEEN 40087.0 AND 40135.999988

[/Quote]

晕。。sql 里面有Date型变量吗?
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 syw_java 的回复:]
where语句里面用计算列的话,mssqlserver似乎不会优化的
[/Quote]

where 后面就跟了一个时间的判断 其它都没有加
syw_java 2009-11-18
  • 打赏
  • 举报
回复
where语句里面用计算列的话,mssqlserver似乎不会优化的
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 fredrickhu 的回复:]
具体看看执行计划 是什么样子的 确实有点奇怪
[/Quote]

謝謝,執行計劃不太懂,還是先看看
--小F-- 2009-11-18
  • 打赏
  • 举报
回复
具体看看执行计划 是什么样子的 确实有点奇怪
--小F-- 2009-11-18
  • 打赏
  • 举报
回复
是不是索引的影响 重新建立下索引试试

* DBCC DBREINDEX
重建指定数据库的一个或多个索引
* DBCC INDEXDEFRAG
对表或视图上的索引和非聚集索引进行碎片整理
* DBCC PINTABLE (db_id,object_id)
lweia 2009-11-18
  • 打赏
  • 举报
回复
执行计划是一样的么?
  • 打赏
  • 举报
回复
to: colacat911

按照你的说法清空緩存后,兩條查詢語句都分別慢了5-8秒種
忆轩辕 2009-11-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jijunwu 的回复:]
引用 1 楼 chinajiabing 的回复:
1.是不是查询时,运行了大的程序;
2.第一次运行要慢点;
这两个语句一样啊!

没有测试过多次,就在Sql查询分析器里面
两个Sql一模一样

除了那个时间的条件,如果是10或大于10的月份就比小于10的月份查询速度慢,
但是大于或等于10的月份的数据没有小于10的月份的多
[/Quote]


--清空缓存
CHECKPOINT
DBCC DROPCLEANBUFFERS WITH NO_INFOMSGS

select getdate()

select * from ..... a.creadate >= '2009-10-1 00:00:00' and a.creadate <= '2009-11-18 23:59:59'

select getdate()

CHECKPOINT
DBCC DROPCLEANBUFFERS WITH NO_INFOMSGS

select getdate()

select * from ..... a.creadate >= '2009-1-1 00:00:00' and a.creadate<= '2009-11-18 23:59:59'

select getdate()



你次执行语句之前清空缓存,然后再看执行时间
icelovey 2009-11-18
  • 打赏
  • 举报
回复
看查询都一样, 加索引应该好些吧
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 icelovey 的回复:]
用BETWEEN '2009-1-1 00:00:00' AND '2009-11-18 23:59:59'
试试?
[/Quote]

测试过一样的效果
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 chinajiabing 的回复:]
1.是不是查询时,运行了大的程序;
2.第一次运行要慢点;
这两个语句一样啊!
[/Quote]
测试环境可以说基本上一样
icelovey 2009-11-18
  • 打赏
  • 举报
回复
用BETWEEN '2009-1-1 00:00:00' AND '2009-11-18 23:59:59'
试试?
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 chinajiabing 的回复:]
1.是不是查询时,运行了大的程序;
2.第一次运行要慢点;
这两个语句一样啊!
[/Quote]
没有测试过多次,就在Sql查询分析器里面
两个Sql一模一样

除了那个时间的条件,如果是10或大于10的月份就比小于10的月份查询速度慢,
但是大于或等于10的月份的数据没有小于10的月份的多
ChinaJiaBing 2009-11-18
  • 打赏
  • 举报
回复
1.是不是查询时,运行了大的程序;
2.第一次运行要慢点;
这两个语句一样啊!
凤矶 2009-11-18
  • 打赏
  • 举报
回复
把时间字串转换成DATE型变量进行比较试试
//select * from ..... a.creadate >= '2009-10-1 00:00:00' and a.creadate <= '2009-//11-18 23:59:59'

select * from ..... a.creadate BETWEEN 40087.0 AND 40135.999988
忆轩辕 2009-11-18
  • 打赏
  • 举报
回复
这个需要你把连接条件也列出来,估计问题出在连接上
menggang9801 2009-11-18
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 jijunwu 的回复:]
引用 18 楼 menggang9801 的回复:
贴出执行计划:


set showplan_all on

运行查询1
运行查询2

set showplan_all off


不懂你寫的兩句Sql的意思

看到估計執行計劃里面,有兩個聚集索引掃描 分別開銷  47%  也就是開銷94%
[/Quote]

要不把数据库backup一下,发给我看看。我的邮箱是:menggang9801@gmail.com


加载更多回复(8)

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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