索引以及填充因子设置

1.DBCC INDEXDEFRAG,DBCC DBREINDEX
2.只有不会出现 INSERT 或 UPDATE 语句时(例如对只读表),才可以使用 FILLFACTOR 100。如果 FILLFACTOR 为 100,SQL Server 将创建叶级页 100% 填满的索引。如果在创建 FILLFACTOR 为 100% 的索引之后执行 INSERT 或 UPDATE,会对每次 INSERT 操作以及有可能每次 UPDATE 操作进行页拆分。
3.DBCC SHOWCONTIG 统计量较低的索引,效率越高。(具体参照SQL Server的联机帮助)
4.SQL Server7.0最好不要在线创建或者删除、整理索引,因对7.0在运行时需要锁定操作所涉及的资源,导致内容阻塞等。而2000相对好一点,只好目前为止,没有因为在运行较密集时,导致建索引的对应数据库表格不能使用的情况。
5.创建索引一般有以下两个目的:维护被索引列的唯一性和提供快速访问表中数据的策略。
6.Microsoft SQL Server是如何判断该使用非聚合不唯一索引还是全表扫描的?
A.为什么有的时候不使用索引?
索引是一棵B树。Microsoft SQL Server在使用非聚合索引时,每读一条数据,都要从某个非聚合索引节点开始,(简单地可以理解为从“根”开始,事实上可优化)层层深入,直到走到代表该条数据的叶子节点,取得指向数据页的指针,通过该指针找到相应的数据页。(当然,如果要找的东西都在索引里,这一步可省) 假设索引是A叉树,数据总量是X行,一个索引节点能放在一个索引页里 那么使用非聚合索引每读一行数据的开销是 读log(A,X) (A是底数)个索引页+ 1个数据页 假设每个数据页可以放B行数据 那么全表扫描的开销是 读X/B 个数据页 (这里的读是“逻辑读”) 由此可见,当读出的行数超过一定程度后,全表扫描的开销将明显低于使用非聚合索引检索的开销
B.怎么判断是否使用索引?
举一个例子: 表里有1万行,每行200字节,索引是4叉树,数据页大小是2k,填充因子50% 则全表扫描要读2000个(数据)页 而使用非聚合索引检索,每一行是 7页(6索引页+ 1个数据页) 如果要读出的行数 > 286 (2000/7),则应该使用全表扫描 于是,是否应使用索引的问题就转化为要读出多少行
C.如何估算要读出的行数?
这就要读索引的统计信息了,统计信息描述的就是“一个索引节点大致函盖了几行数据”,数据库引擎在在没有统计信息的情况下,一般是不会使用非聚合不唯一索引的,因为一旦误用,可能开销要比全表扫描高出好多倍。
统计信息在分布页中,建好索引的时候数据库引擎会自动建好一个分布页,但是修改数据的时候并不维护分布页,所以数据改变过多的时候就需要重建分布页
D.为什么说Microsoft SQL Server 7.0在这方面做得好?
在低版本的数据库中,有一个语句叫UPDATE STATISTICS,它的作用的重建分布页,当数据栏的变动比例超过10%~20%,就应该运行这个语句。 这就意味着,数据库管理员有很多事情要做,比如备份数据,截断日志,重建分布页等 如果你仔细看过SQL7的 Online Book的话,其中有一个存储过程,叫sp_autostats Displays or changes the automatic UPDATE STATISTICS setting for a specific index and statistics, or for all indexes and statistics for a given table in the current database. 就是说,在默认情况下,数据库是会自动更新分布页的,
也就是说,SQL7知道是否应该采用非聚合索引,而其它数据库不知道是否应采用,所以就不采用这样的索引

7.
A.有大量重复值且经常有范围查询和排序、分组发生的列,或者非常频繁地被访问的列,可考虑建立聚簇索引。
B.在一个经常做插入操作的表上建索引时,使用fillfactor(填充因子)来减少页分裂,同时提高并发度降低死锁的发生。如果在只读表上建索引,则可以把fillfactor置为100。
C.经常同时存取多列,且每列都含有重复值可考虑建立复合索引来覆盖一个或一组查询,并把查询引用最频繁的列作为前导列,如果可能尽量使关键查询形成覆盖查询。
D.在选择索引键时,设法选择那些采用小数据类型的列作为键以使每个索引页能够容纳尽可能多的索引键和指针,通过这种方式,可使一个查询必须遍历的索引页面降到最小。此外,尽可能地使用整数为键值,因为它能够提供比任何数据类型都快的访问速度。

8.不恰当的索引不但于事无补,反而会降低系统的执行性能。因为大量的索引在插入、修改和删除操作时比没有索引花费更多的系统时间。例如下面情况下建立的索引是不恰当的:
A.在查询中很少或从不引用的列不会受益于索引,因为索引很少或从来不必搜索基于这些列的行。
B.只有两个或三个值的列,如男性和女性(是或否),从不会从索引中得到好处。
另外,鉴于索引加快了查询速度,但减慢了数据更新速度的特点。可通过在一个段上建表,而在另一个段上建其非聚簇索引,而这两段分别在单独的物理设备上来改善操作性能。

9.csdn上关于索引的一篇文章,大家可以参照DBCC SHOWCONTIG的SQL Server联机帮助。
http://dev.csdn.net/Develop/article/13/13919.shtm

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值