您的位置:首页 > 数据库

Sql Server 重建索引提高SQL Server性能

2013-01-30 10:42 316 查看
大多数SQL Server表需要索引来提高数据的访问速度,如果没有索引,SQL Server要全表进行扫描读取表中的每一个记录才能找到所要的数据

可以通过DBCC SHOWCONTIG来确定是否需要重构表的索引。

DBCC SHOWCONTIG用法

以PSNACCOUNT数据表作为例子

DECLARE @table_id INT

SET @table_id=object_id('PSNACCOUNT')

DBCC SHOWCONTIG(@table_id)

DBCC SHOWCONTIG 正在扫描 'PSNACCOUNT' 表...

表: 'PSNACCOUNT' (2005582183);索引 ID: 1,数据库 ID: 6

已执行 TABLE 级别的扫描。

- 扫描页数................................: 1960

- 扫描区数..............................: 252

- 区切换次数..............................: 1957

- 每个区的平均页数........................: 7.8

- 扫描密度 [最佳计数:实际计数].......: 12.51% [245:1958]

- 逻辑扫描碎片 ..................: 99.13%

- 区扫描碎片 ..................: 75.00%

- 每页的平均可用字节数.....................: 3572.0

- 平均页密度(满).....................: 55.87%

DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。

信息 描述

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为245而Actual Count为1958。这表明orders表有分块,需要重构表索引。

下面通过DBCC DBREINDEX来重构表的簇索引。

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。

DBCC DBREINDEX('dbo.PSNACCOUNT','',90)

DECLARE @table_id INT

SET @table_id=object_id('PSNACCOUNT')

DBCC SHOWCONTIG(@table_id)

DBCC SHOWCONTIG 正在扫描 'PSNACCOUNT' 表...

表: 'PSNACCOUNT' (2005582183);索引 ID: 1,数据库 ID: 6

已执行 TABLE 级别的扫描。

- 扫描页数................................: 1176

- 扫描区数..............................: 147

- 区切换次数..............................: 146

- 每个区的平均页数........................: 8.0

- 扫描密度 [最佳计数:实际计数].......: 100.00% [147:147]

- 逻辑扫描碎片 ..................: 0.00%

- 区扫描碎片 ..................: 3.40%

- 每页的平均可用字节数.....................: 568.6

- 平均页密度(满).....................: 92.97%

DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。

通过结果我们可以看到Scan Denity扫描密度为100%

可是要是一个一个表去整理,是一件比较繁琐的事情。

一次性整理一个数据库中所有SCHEMA为dbo的表的索引的脚本

USE [databasename];

DECLARE @name NVARCHAR(100)

DECLARE authors_cursor CURSOR FOR

SELECT [name] FROM sysobjects WHERE xtype = 'u' ORDER BY id

OPEN authors_cursor

FETCH NEXT FROM Authors_cursor Into @name

WHILE @@Fetch_status = 0

BEGIN

DBCC DBREINDEX (@name, '', 90)

FETCH NEXT FROM Authors_cursor Into @name

END

CLOSE authors_cursor

DEALLOCATE authors_cursor
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: