一百万条纪录的表,加上聚集索引后,查询的速度没有变化,请帮忙,谢谢。
表Tab结构
id(int,主键) name(varchar) value1(int) time1(datetime,not null)
有一百万条纪录,我给time字段加上了聚集索引,但是查询所用的时间没有变化,加索引和不加索引所用的查询时间都是12秒,是因为数据太少吗?谢谢大家
(time1字段值的范围是从 2000-1-1 到 2009-1-1)
select id,name,value1,time1 from Tab
where time > '2002-01-01 '
结果是70万条纪录,用时12秒。
------解决方案--------------------1 索引用没用到看看查询计划, 一般来说能用到的
2 你感觉不出效果来 是因为返回的结果集合太大了 70w?!!!
------解决方案--------------------1 索引应该是用到了
2 没感觉出效果 是因为返回的结果集合太大了 OS处理耗时
------解决方案--------------------你用执行计划(查询分析器)看看用到了索引了吗;
感觉应当用到了。可能数据量和你的服务器性能有关;
------解决方案--------------------理论上应该用到索引
但是就查询比较的话,你的应该是没有用到
可以强制应用索引试一下
select id,name,value1,time1 from Tab with(index (索引名))
where time > cast( '2002-01-01 ' as datetime)
------解决方案--------------------有些时候动态语句编译后SQL应用索引更加有效
试一下下面的和上面进行比较
declare @SQL Varchar(8000),@date char(10)
Set @Date= '2002-01-01 '
Set @Sql= 'select id,name,value1,time1 from Tab where time > '+@Date
Exec(@Sql)
你可以看一下执行计划来确定是否应用到了聚集索引
------解决方案--------------------100w里面取70w,如果数据库用索引来取就死了。这种情况是通过全表扫描来取记录的。
------解决方案--------------------当查询返回的数据量很多时,SQL会改用全表扫描,但查询计划分析里应该显示index scan,而不是table scan
------解决方案--------------------返回的记录集超过全表记录的一定百分比,就不会使用索引,因为使用索引反而会慢。
------解决方案--------------------Tigersong(宋)
1 索引应该是用到了
2 没感觉出效果 是因为返回的结果集合太大了 OS处理耗时
------------------------------------------------------
这个应该是正确答案.
70w的记录,占用了很多I/O,时间长点很正常.
------解决方案--------------------既然聚集了,说明按照时间已经把相邻的时间都物理的安排的到了一起,为什么不考虑用between来替代 > 、 <。
------解决方案--------------------between 和 > , < 是一样的.
------解决方案--------------------你应该在时间上建立聚集索引,而且一个表只能有一个聚集索引,主键默认为聚集索引,你要取消主键,然后在实践上建立索引,查询的时候你应该用> ,=, <或者between等查询
------解决方案--------------------between 跟 > 、 < 效率都是一样的,我测试啦
------解决方案--------------------取出的数据太多了。看过的书上都说一次取出的记录集小于10%时,才方便用索引。
可是你的一次取出的已经超过70%了