日期:2014-05-17  浏览次数:20416 次

如何优化大数据量查询的速度
一张数据表中有260W条记录
要从其中获取40W条
仅仅使用Select Top 400000 * From ......
就使用了11秒
(我自己的笔记本上实验的结果,时间为在查询分析器中执行命令获取结果的时间)


有没有什么方法可以速度快点?


另外,如果灭有方法优化的话,
如果能在客户端程序上显示获取40W条记录
的进度(通过进度条),从而让客户能看到当前执行的情况

------解决方案--------------------
由于你的是2000,有很多优化错误做不了,那尽量做一些力所能及的吧:
1、考虑数据的使用,比如你每次都需要top的时候,那么聚集索引的创建最后根据order by的字段来创建,这样减少了排序的开销。
2、其实在使用的时候,大部分的数据表都不会每次全表,全字段显示的,你觉得用户得到40万数据的时候要怎么使用呢?很难用吧,所以一定要根据数据的存储、使用方式来创建聚集、非聚集索引。
3、考虑把表按实体表分区。比如可以按年或者按月分区。减少数据量
4、你的Select Top 400000 * From ......都基本上没使用到索引,所以11秒也说得过去,这个只是你优化的基准,其实不代表什么的。
------解决方案--------------------
如果是新版本,那有很多措施,但是2000的话会有点难度,既然知道你的数据使用,我再详细说一下吧:
由于是月度数据,你可以按一个月一个月来存放(如果可以的话),40万全表扫描不会很久的。另外,日期列作为聚集索引,按照你的order by来创建聚集索引的顺序。主键是为了标识一行,其实不一定就要有索引,但是通常都会有。如果between and比top还慢,证明你的索引建的不合理或者没有真正发挥出来。
------解决方案--------------------
如果只是 Select ....From ... Where B_Date Between 日期1 And 日期2这样的句式,40w数据的选择可以0秒显示,这个绝对没有问题.

但是有几点要注意一下:
1.你B_Date, 日期1 ,日期2 这样的值,要真正的日期值,别用varchar
2.你外联的表中如果有函数,那么时间会增加很多.
3.给条件中以及外联的列使用用主键和索引
------解决方案--------------------
你说会group by 成100条数据?使用索引视图吧
这个应该是最快的了