博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
重建索引提高SQL Server性能<转>
阅读量:6618 次
发布时间:2019-06-25

本文共 3751 字,大约阅读时间需要 12 分钟。

大多数SQL Server表需要索引来提高数据的访问速度,如果没有索引,SQL Server 要全表进行扫描读取表中的每一个记录才能找到所要的数据。索引可以分为簇索引和非簇索引:簇索引通过重排表中的数据来提高数据的访问速度;而非簇索引则通过维护表中的数据指针来提高数据的访问速度。

1. 
索引的体系结构
        SQL Server 2005
在硬盘中用
8KB
页面在数据库文件内存放数据。缺省情况下这些页面及其包含的数据是无组织的。为了使混乱变为有序,就要生成索引。生成索引后,就有了索引页和数据页之分:数据页用来保存用户写入的数据信息;索引页存放用于检索列的数据值清单(关键字)和索引表中该值所在纪录的地址指针。索引分为簇索引和非簇索引,簇索引实质上是将表中的数据排序,就好像是字典的索引目录。非簇索引不对数据排序,它只保存了数据的地址。向一个带簇索引的表中插入数据,当数据页达到
100%
时,由于页面没有空间插入新的的纪录,这时就会发生分页,
SQL Server 
将大约一半的数据从满页中移到空页中,从而生成两个1/2满页。这样就有大量的空的数据空间。簇索引是双向链表,在每一页的头部保存了前一页、后一页以及分页后数据移出的地址。由于新页可能在数据库文件中的任何地方,因此页面的链接不一定指向磁盘的下一个物理页。链接可能指向了另一个区域,这就形成了分块,从而减慢了系统的速度。对于带簇索引和非簇索引的表来说,非簇索引的关键字是指向簇索引的,而不是指向数据页的本身。
        为了克服数据分块带来的负面影响,需要重构表的索引,这是非常费时的,因此只能在需要时进行。
可以通过
DBCC SHOWCONTIG
来确定是否需要重构表的索引。
2. 
DBCC SHOWCONTIG
用法
        下面举例来说明
DBCC SHOWCONTIG
DBCC REDBINDEX
的使用方法。以
应用程序中
Employee
数据
作为例子
,在
 SQL Server
Query analyzer
输入命令:
use database_name 
declare @table_id int 
set @table_id=object_id('Employee') 
dbcc showcontig(@table_id)

 

 
输出结果:
 
DBCC SHOWCONTIG scanning 'Employee' table... 
Table: 'Employee' (1195151303); index ID: 1, database ID: 53 
TABLE level scan performed. 
- Pages Scanned................................: 179 
- Extents Scanned..............................: 24 
- Extent Switches..............................: 24 
- Avg. Pages per Extent........................: 7.5 
- Scan Density [Best Count:Actual Count].......: 92.00% [23:25] 
- Logical Scan Fragmentation ..................: 0.56% 
- Extent Scan Fragmentation ...................: 12.50% 
- Avg. Bytes Free per Page.....................: 552.3 
- Avg. Page Density (full).....................: 93.18% 
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

 

 
通过分析这些结果可以知道该表的索引是否需要重构。如下描述了每一行的意义:
 
信息
                                                          
描述
Pages Scanned                           
表或索引中的长页数
Extents Scanned                         
表或索引中的长区页数
Extent Switches                          DBCC
遍历页时从一个区域到另一个区域的次数
Avg. Pages per Extent              
相关区域中的页数
Scan Density[Best Count:Actual Count]       
        Best Count
是连续链接时的理想区域改变数,
Actual Count
是实际区域改变,
        Scan Density
100%
表示没有分块。
Logical Scan Fragmentation   
扫描索引页中失序页的百分比
Extent Scan Fragmentation    
不实际相邻和包含链路中所有链接页的区域数
Avg. Bytes Free per Page       
扫描页面中平均自由字节数
Avg. Page Density (full)         
平均页密度,表示页有多满

 

 
        从上面命令的执行结果可以看的出来,
Best count
23 
Actual Count
25。
这表明
orders
表有分块,需要重构表索引。下面通过
DBCC DBREINDEX
来重构表的簇索引。
3
. DBCC DBREINDEX 
用法
        重建指定数据库中表的一个或多个索引。
语法
 
DBCC DBREINDEX 
(     
    [ 'database.owner.table_name'     
        [ , index_name 
            [ , fillfactor ] 
        ] 
    ]  
)      

 

 
参数
'database.owner.table_name'
        是要重建其指定的索引的表名。
数据库、所有者和表名必须符合标识符的规则。有关更多信息,请参见使用标识符。
如果提供
 database 
 owner 
部分,则必须使用单引号
 (') 
将整个
 database.owner.table_name 
括起来。如果只指定
table_name
,则不需要单引号。
index_name
        是要重建的索引名。
索引名必须符合标识符的规则。
如果未指定
 index_name 
或指定为
 ' '
,就要对表的所有索引进行重建。
fillfactor
        是创建索引时每个索引页上要用于存储数据的空间百分比。
fillfactor 
替换起始填充因子以作为索引或任何其它重建的非聚集索引(因为已重建聚集索引)的新默认值。如果
 fillfactor 
 0
DBCC DBREINDEX 
在创建索引时将使用指定的起始
fillfactor
        同样在
Query Analyzer
中输入命令:
        dbcc dbreindex('database_name.dbo.Employee','',90)
        然后再用
DBCC SHOWCONTIG
查看重构索引后的结果:
 
DBCC SHOWCONTIG scanning 'Employee' table... 
Table: 'Employee' (1195151303); index ID: 1, database ID: 53 
TABLE level scan performed. 
- Pages Scanned................................: 178 
- Extents Scanned..............................: 23 
- Extent Switches..............................: 22 
- Avg. Pages per Extent........................: 7.7 
- Scan Density [Best Count:Actual Count].......: 100.00% [23:23] 
- Logical Scan Fragmentation ..................: 0.00% 
- Extent Scan Fragmentation ...................: 0.00% 
- Avg. Bytes Free per Page.....................: 509.5 
- Avg. Page Density (full).....................: 93.70% 
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

 

 
        通过结果我们可以看到
Scan Denity
100%

本文转自温景良(Jason)博客园博客,原文链接:http://www.cnblogs.com/wenjl520/archive/2010/07/11/1775089.html如需转载请自行联系原作者

版权说明
你可能感兴趣的文章
创业杂记——重视自己【序】
查看>>
java面试①整体流程
查看>>
nginx http proxy 正向代理
查看>>
Python type()函数用途及使用方法
查看>>
Swift 静态派发和动态派发
查看>>
BZOJ2002: [Hnoi2010]Bounce 弹飞绵羊(LCT)
查看>>
《从“为什么”开始》听书笔记
查看>>
SQL FORMAT() 函数
查看>>
Adhesive框架系列文章--WCF 分布式服务模块使用和实现
查看>>
BMP_GIF_PNG_LZW_LZ77简介
查看>>
Lucene之IndexWriter的锁机制(备忘)
查看>>
Tracing in ASP.NET Web API
查看>>
objective-c 实现用户验证,登陆 Xcode iOS
查看>>
ACM-博弈论
查看>>
android开源项目-旅游记录
查看>>
Android ListView中按钮监听器设置的解决方案
查看>>
Android 富文本框实现 RichEditText
查看>>
localtime 和 localtime_r
查看>>
多媒体开发之---h264 NALU 语法结构
查看>>
腾讯游戏分享汇:天天飞车六大研发经验
查看>>