千万级别数据查询

leinwpu 2011-04-26 11:54:37
一个表数据大约几千万条,表很简单就是id和value两个字段

对其中的某些数据求和,用最简单的条件测试

select sum(value) from table1 where id<3000

速度很快,不到1秒
测试发现当查询条件id超过某个门限之后,比如8000,时间增加到10秒左右
并且不再增加,也就是从8001以上都是10秒


请问这是什么原因,有没有办法优化
...全文
123 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
benjoyeh 2011-04-27
  • 打赏
  • 举报
回复
我记得有个数据分块的说法吧,有一个界限,界限内的数据都放在同一块,所以查询速度快,别的正好放另一块上去了,所以就慢一些。
orochi_gao 2011-04-27
  • 打赏
  • 举报
回复
到一定临界值就会是table scan而不是seek了,至于临界点的计算方式,这估计得问微软.
看不看这个:

http://topic.csdn.net/u/20110318/10/91bd46ea-8366-4a64-b2de-8c2ce4ef57a4.html
leinwpu 2011-04-27
  • 打赏
  • 举报
回复
这个表是有索引的,磁盘用的是Raid5

我的疑问也是为什么有这个门限
如果我从中间取一段数据,大约也是8000条左右,但是和从0开始取的数量不完全一样,所以没有一个硬性的8000条的限制
zhouguoyu2013 2011-04-27
  • 打赏
  • 举报
回复
楼上的,如何认定8001上是全表扫描,而3000以内就不是呢?
以什么方式来判断的?
rucypli 2011-04-27
  • 打赏
  • 举报
回复
8001以上 都是全表扫描
mabailin 2011-04-27
  • 打赏
  • 举报
回复
当ID超过8000时返回记录会不会大幅度增加
claro 2011-04-27
  • 打赏
  • 举报
回复
--仅供参考
1、检查该表值是否存在相应的索引。
--sp_helpindex table_name

2、重建该表的索引。

3、将该表数据按id分区,并拆分在不同的磁盘。

22,209

社区成员

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

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