SQL Server高级性能调优策略
2010-10-21 04:22:15 来源:WEB开发网说到这补充一点,一般影响SQLServer调优的有4个部分:系统调优占2.5%,数据库调优占17.5%,设计调优占20%,程序可调优的空间最大占60%。呵呵,但是一般DBA拿到一个系统的时候,设计调优和程序可调优是不可控的,应为他不可能去改买来的软件。
下面先看看索引步骤,这些有利于大家对索引的认识。
一、堆
1、sqlserver在sysindexes表中查到对应的数据行
2、读取indid值(应为堆没有索引所以是0)后,sqlserver开始读取firstIAM值,获取堆的IAM的第一页(8KB)的位置。(IAM将堆的各个区域联接在一起)
3、sqlserver根据IAM提供的区域地址,一个区域一个区域的查找,一个数据页一个数据页的查找,直到获取所需的数据为止。
二、簇索引
1、sqlserver在sysindexes表中查到对应的数据行,找到indid为1后,sqlserver开始读取root列的值。(列值是根页面的地址)
2、找到根页面后开始搜索,比如要搜索的表是10条记录一页,这里是找“1981”这个值,将索引的值“1981”与根页面的索引比较。由于“1981”是在1900到2000之间。所以sqlserver开始搜索1900所在的中间页。
3、找到“1900”所在的中间页后,将索引值“1981”继续与中间页的索引比较,由于“1981”是在1980到1990之间。所以sqlserver开始搜索1980所在的数据页。(注意这一步是根据中间页找数据页)
4、找到“1980”所在的数据页后,将索引值“1981”继续与数据页的索引比较,很快就可以在这个数据页上找到“1981”的数据行了。
三、非簇索引
1、sqlserver在sysindexes表中查到对应的数据行,找到indid为后,值为2到251后,sqlserver开始读取root列值。
2、找到根页面后,将“1981”与根页面的索引比较,由于“1981”是在1900到2000之间。所以sqlserver开始搜索1900所在的中间页。(注意这一步是根据中间页找叶页面)
3、找到中间页后,将索引值“1981”继续与中间页的索引比较,由于“1981”是在1980到1990之间。所以sqlserver开始搜索1980所在的叶页面。
4、找到“1980”所在的叶页面后,继续叫索引值“1981”与叶页面上的关键字比较,在叶页面上找到关键字为“1981”的数据行ID。
5、根据数据行ID提供的数据页和数据行信息,定位到指定的数据页和数据行,找到“1981”这条记录是“晶”的。
堆在数据表小于8K的时候访问速度最快,它不需要去找索引,应为当你的数据本来就在一个页里也没有必要用索引。簇索引,在使用簇索引查询的时候,区块查询是最快的,如用between,应为他是物理连续的,你应该尽量减少对它的updaet,应为这可以使它物理不连续。非簇索引与物理顺序无关,设计它时必须有高度的可选择性,可以提高查询速度,但对表update的时候这些非簇索引会影响速度,且占用空间大,如果你愿意用空间和修改时间换取速度可以考虑。如果在视图上建立索引,那视图的结果集就会被存储起来,对与特定的查询性能可以提高很多,但同样对update语句时它也会严重减低性能,一般用在数据相对稳定的数据仓库中。好,为什么update会影响索引,打个比方:1 2 3 4 5 6 7 8 |1 2 ..它们在insert后是物理连续的,每个数字代表一条数据,一条数据1K,分割符前正好填满一页,在做查询时由于不需要指针跳转,所以效率是最佳的,而这是update了3把它的数据量改为了1.2K,超过原来的一页(8K)的大小,这时sqlserver会: 1 2 4 5 6 7 8|1 2.....| 3(1.2k) 将3放到最后面可以插入的空间去。而2的指针还是指向3,如果这时你再检索,当检索到2的时候,物理指针将跳转到3上,然后再跳转回4。如果看懂的话,应该明白了为什么不提倡update索引过的列,不提倡使用varchar类型的列当索引。应为varchar是变长的,如果你频繁的update它,你的索引会事得其反。而sqlserver里也提供了填充因子来减少来自这方面的影响,比如你的因子为20%,当插入数据时,发现这个页底于20%的可用空间,sqlserver不会再继续插入这一页而是申请新的一页存储如:1 2 3 4 5 6 | 7 8 1 2 .. 当你再update 3为1.2K的时候将不会将3分到其他页上。那是不是填充因子越大越好呢,不是的,如果太大,浪费空间不算什么,主要是会影响查询效率,应为在查询过程中最大消耗是来自于读取新页。所以你必须根据你的实际情况,适当设置。
维护索引也是很重要的,update是一个破坏索引的方式,它不但使指针跳转,而且使数据冗余,产生了许多碎片。你就需要用DBCC INDEXDEFRAG 整理指定的表或视图的聚集索引和辅助索引碎片。另外我们知道索引一般会有一个根比如有1 2 3 4 5,那建立索引的时候根是3,取中间的。当我们开始向这个表填加数据,比如这个列是一个顺序增长的如1 2 3 4 5...10000,这时发生了根节点偏移,应为根还是3而,就好象这个树变成了单边树,只往一个方向长。而这个现象是很常见的。而维护索引也很简单,最有效的办法是用DBCC DBREINDEX重建索引。
-----------上面版权所属pengdali(大力 V3.0)-------------------------------------------------
- ››sql server自动生成批量执行SQL脚本的批处理
- ››sql server 2008亿万数据性能优化
- ››SQL Server 2008清空数据库日志方法
- ››SQL SERVER无法安装成功,sqlstp.log文件提示[未发...
- ››Sql Server中通过父记录查找出所有关联的子记录
- ››SQL Server 中的事务(含义,属性,管理)
- ››Sql server 2005拒绝了对对象 'xx表' (数...
- ››Sql server 2005拒绝了对对象 'xx表' (数...
- ››Sql server 2005拒绝了对对象 'xx表' (数...
- ››SQL Server 千万数量级 分页 存储过程
- ››Sql Server 2005自定义Split函数
- ››SQL Server 2008 中的hierarchyid类型应用
更多精彩
赞助商链接