重建索引提高SQL Server性能<转>

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介:

大多数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%

原文地址:http://fly3118.blog.51cto.com/361030/83836



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

版权说明
相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
|
14天前
|
SQL 人工智能 算法
【SQL server】玩转SQL server数据库:第二章 关系数据库
【SQL server】玩转SQL server数据库:第二章 关系数据库
52 10
|
1月前
|
SQL 存储 数据库
sql事务、视图和索引
sql事务、视图和索引
14 0
|
1月前
|
SQL 数据库 数据安全/隐私保护
Sql Server数据库Sa密码如何修改
Sql Server数据库Sa密码如何修改
|
1月前
|
SQL 存储 弹性计算
GaussDB SQL调优:建立合适的索引
GaussDB SQL调优:建立合适的索引
12 0
|
1月前
|
存储 关系型数据库 MySQL
最全MySQL面试60题(含答案):存储引擎+数据库锁+索引+SQL优化等
最全MySQL面试60题(含答案):存储引擎+数据库锁+索引+SQL优化等
175 0
|
24天前
|
SQL
启动mysq异常The server quit without updating PID file [FAILED]sql/data/***.pi根本解决方案
启动mysq异常The server quit without updating PID file [FAILED]sql/data/***.pi根本解决方案
17 0
|
14天前
|
SQL 算法 数据库
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
84 6
|
1天前
|
SQL 数据管理 关系型数据库
如何在 Windows 上安装 SQL Server,保姆级教程来了!
在Windows上安装SQL Server的详细步骤包括:从官方下载安装程序(如Developer版),选择自定义安装,指定安装位置(非C盘),接受许可条款,选中Microsoft更新,忽略警告,取消“适用于SQL Server的Azure”选项,仅勾选必要功能(不包括Analysis Services)并更改实例目录至非C盘,选择默认实例和Windows身份验证模式,添加当前用户,最后点击安装并等待完成。安装成功后关闭窗口。后续文章将介绍SSMS的安装。
4 0
|
2天前
|
SQL 关系型数据库 MySQL
:“You have an error in your SQL syntax; check the manual that corresponds to your MySQL server versi
:“You have an error in your SQL syntax; check the manual that corresponds to your MySQL server versi
9 0
|
9天前
|
SQL 安全 网络安全
IDEA DataGrip连接sqlserver 提示驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接的解决方法
IDEA DataGrip连接sqlserver 提示驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接的解决方法
20 0