令,返回5000多个记录
select * from Chq where date >='02/01/2001' and date<='02/28/2001'
显示的时间和读写情况:
Table 'chq'. Scan count 1, logical reads 13145, physical reads 0, read-ahead reads 13152.
SQL Server Execution Times: CPU time = 5781 ms, elapsed time = 23526 ms.
然后我在CHQ表上对DATE字段建立索引,再运行相同的SELECT, 得到如下结果:
Table 'chq'. Scan count 1, logical reads 3965, physical reads 14, read-ahead reads 0.
SQL Server Execution Times: CPU time = 704 ms, elapsed time = 6432 ms.
比较两个结
果可以看出, 建立索引后,逻辑读写和预读写次数大大减少, 占用CPU时间从5.781秒减少到了0.704秒, 总运行时间从23.526秒减少到6.432秒
如果运行更复杂的命令,效果会更加明显.
2. 了解SQL SERVER的索引
SQL SERVER的数据文件和索引文件都是以页为单位存放的,每页是8K. 相当于把磁盘划分成8K大小的块,以块为单位存放数据.
了解这一点是非常重要的, 它能帮助你理解下面的内容.
SQL SERVER的索引有2大类,
一类是CLUSTERED(物理索引),每个表只能有一个, 记录在磁盘上存放时完全按照物理索引的顺序.
一类是NONCLUSTERED(逻辑索引), 记录顺序存放在索引表里.
不管是哪类索引,只要能到达目的,索引表达式(包含的字段)越简单越有效.
什么字段作为物理索引最合适?
有两个原则: 一是在根据范围来选择记录时,哪个字段最有效, 二是在往磁盘上写记录是不会引起热点(HOT SPOT).
热点是指,大量读写发生在磁盘的同一区域,引起I/O瓶颈效应,降低运行速度.
我们用例子来看看这些原则怎么用.
假如有个单据表, 包含这些字段: 单据号,单据日期,金额,销售地点,已经其它数据.
哪个适合作为物理索引呢? 一般的想法是用没有重复值的字段(相当于VFP里的主键).
a. 用单据号, 其实这不是恰当的选择. 因为很少有根据单据的范围来选择记录的, 比如你很少用命令来
查询单据号大于或者小于某个值的记录. 而且在输入时,也比较容易产生热点, 因为插入的记录一般都加在表尾,当有大量用户同时输入时,会产生热点. 单据号不符合上面的2条原则.
b. 用单据日期, 似乎是个比较适当的选择. 因为经常需要用日期范围来选择记录, 但同样会因为大量用户同时输入最新单据而在磁盘上引起热点.
c. 用销售地点, 这应该是最恰当的物理索引人选了. 因为我们会经常根据地点来选择记录, 而在同一时刻插入的记录也不太可能来自同一个销售地点,避免了热点.
当然,不同的环境下,你的选择可能不同,比如你没有成千上万的用户,就不太需要考虑热点
问题. 但要记住, 有唯一值的字段并不是物理索引的最佳选择.
3. 选择适当的FillFactor
在SQL-CREATE INDEX命令里,有个FILLFACTOR选项, 这个选项对索引的效率是有很大作用的.
FILLFACTOR是指建立索引时, 每一页存放数据的填满程度, 比如100%,表示把索引文件每一页都填满,隐含值是0 (100%).
如果你的表经常需要插入记录, 选择适当的FILLFACTOR就很重要了. 如果总是用100%, 当你插入一个新记录时, 由于每页都是满的, 就需要进行分页操作(把当前页分成2页),频繁的分页操作会占用服务器的资源和时间,也降低索引文件的效率. 而如果你的FILLFACTOR不是100%,比如
设为80%, 在插入新记录时,由于当前页还有空间, 可以直接加入不需要分页. 当然, FILLFACTOR太低也会降低效率,因为那样的话,页数就多了,
搜索数据用的时间长,占用空间也多.
如果是只读表,或者插入记录很少的表,用100% FILLFACTOR最好.
对于经常插入新记录的表,需要定期重建索引, 因为索引文件随着页数的增加, 效率会越来越低. 因为索引都