首页 新闻 会员 周边 捐助

统计200万条数据速度很慢怎么改善

0
悬赏园豆:100 [已关闭问题] 关闭于 2010-08-05 15:14

统计200万条数据需要12分钟,太痛苦了。请高手指教下有没有什么好的方法让他执行得快些。在此先谢过!数据库是SqlServer2005,有一张表,表里面有200万条数据,按时间段进行分组统计。我是这样写sql语句的:SELECT COUNT(*) FROM table1 WHERE time1 BETWEEN '' AND '' GROUP BY time1 

问题补充: time1 是datetime 类型的 要是我想这样查呢? SELECT COUNT(*),YEAR(time1) FROM table1 WHERE time1 BETWEEN '2010-07-28 19:23:35.000' AND '2010-07-30 19:23:35.000' GROUP BY YEAR(time1) 就是在time1这个时段内按年来分组查询。 time1已经建立了索引。
39.5℃的主页 39.5℃ | 初学一级 | 园豆:2
提问于:2010-07-30 16:30
< >
分享
所有回答(10)
0

time1建立索引了吗?

dudu | 园豆:30948 (高人七级) | 2010-07-30 16:41
没有
支持(0) 反对(0) 39.5℃ | 园豆:2 (初学一级) | 2010-07-30 17:01
我不是很了解索引
支持(0) 反对(0) 39.5℃ | 园豆:2 (初学一级) | 2010-07-30 17:01
@guolq:建一下索引,速度会快很多
支持(0) 反对(0) dudu | 园豆:30948 (高人七级) | 2010-07-30 18:20
谢谢!
支持(0) 反对(0) 39.5℃ | 园豆:2 (初学一级) | 2010-08-02 13:14
0

除了dudu的问题。

修改为SELECT COUNT(0) FROM table1 WHERE time1 BETWEEN '' AND '' GROUP BY time1 

然后自己看下查询计划。

是否试过将Year(time1)另建一个新字段?

邀月 | 园豆:25475 (高人七级) | 2010-07-30 17:02
试了下,还是一样慢
支持(0) 反对(0) 39.5℃ | 园豆:2 (初学一级) | 2010-07-30 17:18
新增一字段,值为Year(time1)
支持(0) 反对(0) 邀月 | 园豆:25475 (高人七级) | 2010-08-01 19:59
要是这样的话,按月、日统计也要建立字段?
支持(0) 反对(0) 39.5℃ | 园豆:2 (初学一级) | 2010-08-02 08:49
再添加个月、日也不会有多麻烦呀。这种问题,归根到底就是空间换时间。
支持(0) 反对(0) 麦舒 | 园豆:452 (菜鸟二级) | 2010-08-02 16:13
呵呵,我随便弄了弄,现在很快了,一秒钟结果就出来了
支持(0) 反对(0) 39.5℃ | 园豆:2 (初学一级) | 2010-08-03 10:07
0

如果是日期类型字段,建立聚合索引。这样要快的多!

Astar | 园豆:40805 (高人七级) | 2010-07-30 17:07
谢谢!
支持(0) 反对(0) 39.5℃ | 园豆:2 (初学一级) | 2010-08-02 13:14
0

预处理是不二法门,先建立聚合表,每插入一条数据时,就在聚合表中累加,到时直接查聚合表就好了。

或者上数据仓库,索引等无法彻底解决问题

Alvin | 园豆:828 (小虾三级) | 2010-07-30 20:27
谢谢!
支持(0) 反对(0) 39.5℃ | 园豆:2 (初学一级) | 2010-08-02 13:14
0

SELECT COUNT(*) FROM table1 WHERE time1 BETWEEN '________________' AND '________________'
union all
select count(*) from table1
贴一下执行结果。

再贴一下
SELECT COUNT(*),year(time1) FROM table1 WHERE time1 BETWEEN '________________' AND '________________' group by year(time1)
的执行计划。

 

killkill | 园豆:1192 (小虾三级) | 2010-07-30 23:04
按你的方法执行是变快了,但是要是我再加一个筛选条件就变慢了
支持(0) 反对(0) 39.5℃ | 园豆:2 (初学一级) | 2010-08-02 08:59
我是给你找问题,不是给你解决问题。这个SQL是统计你数据量的分布情况和比例。
支持(0) 反对(0) killkill | 园豆:1192 (小虾三级) | 2010-08-02 10:02
谢谢!我已经得到我要的效果了。
支持(0) 反对(0) 39.5℃ | 园豆:2 (初学一级) | 2010-08-02 13:18
0

要是不精确到时间只到日期 的话可以考虑报日期拆成year,month,day,对int的操作会快很多

dege301 | 园豆:2825 (老鸟四级) | 2010-07-30 23:31
谢谢!
支持(0) 反对(0) 39.5℃ | 园豆:2 (初学一级) | 2010-08-02 13:18
0

提供一个思路,优化如下:

1.在time1上建立Index,如果已经建立Index就重建Index(如果有索引碎片,会影响查询速度)

2.Count(*)改为Count(1),因为只是统计计数

3.如果time1没有重复值,Group by不需要.

4.再就是看你Server的配置了.

希望对你有所帮助.

changbluesky | 园豆:854 (小虾三级) | 2010-07-31 11:00
谢谢!time1有重复值。
支持(0) 反对(0) 39.5℃ | 园豆:2 (初学一级) | 2010-08-02 08:41
0

利用冗余字段吧。YEAR(time1) 是一函数,没法使用索引的,加个 YEAR 的冗余字段然后加下索引,就很容易解决这个问题了。

麦舒 | 园豆:452 (菜鸟二级) | 2010-07-31 20:31
谢了!
支持(0) 反对(0) 39.5℃ | 园豆:2 (初学一级) | 2010-08-02 13:19
0

关注此贴,楼主索引是怎么建的呢?

2008年的梦想 | 园豆:3 (初学一级) | 2010-08-01 13:54
在time1建了个索引
支持(0) 反对(0) 39.5℃ | 园豆:2 (初学一级) | 2010-08-02 08:27
0

select max(列名ID) from 表名

这样会快点

还有一种是

select count(1)from 表名

你试试

云锋 | 园豆:270 (菜鸟二级) | 2010-08-02 12:03
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册