DBCC大全集之(适用版本MS SQLServer 2008 R2)----DBCC INDEXDEFRAG指定表或视图的索引碎片整理

DBCC大全集之(适用版本MS SQLServer 2008 R2)----DBCC INDEXDEFRAG指定表或视图的索引碎片整理,第1张

概述指定表或视图索引碎片整理。 重要提示 后续版本的 Microsoft SQL Server 将删除该功能。请不要在新的开发工作中使用该功能,并尽快修改当前还在使用该功能的应用程序。请改用 ALTER INDEX。  Transact-SQL 语法约定 语法 DBCC INDEXDEFRAG(    { database_name | database_id | 0 }     , { ta

指定表或视图的索引碎片整理

重要提示

后续版本的 Microsoft sql Server 将删除该功能。请不要在新的开发工作中使用该功能,并尽快修改当前还在使用该功能的应用程序。请改用 ALTER INDEX。

 Transact-SQL 语法约定

语法
DBCC INDEXDEFRAG(    { database_name | database_ID | 0 }     ,{ table_name | table_ID | vIEw_name | vIEw_ID }     [,{ index_name | index_ID } [,{ partition_number | 0 } ] ])    [ WITH NO_INFOMSGS ] 
参数
database_namedatabase_ID | 0

包含要进行碎片整理的索引的数据库。如果指定 0,则使用当前数据库。数据库名称必须符合标识符规则。

table_name |  table_ID |  vIEw_name |  vIEw_ID

包含要进行碎片整理的索引的表或视图。表和视图的名称必须符合标识符规则。

index_name | index_ID

要进行碎片整理的索引的名称或 ID。如果未指定,该语句将针对指定表或视图的所有索引进行碎片整理。索引名称必须符合标识符规则。

partition_number | 0

要进行碎片整理的索引的分区号。如果未指定或指定 0,该语句将对指定索引的所有分区进行碎片整理。

WITH NO_INFOMSGS

取消严重级别从 0 到 10 的所有信息性消息。

注释

DBCC INDEXDEFRAG 对索引的叶级进行碎片整理,以便页的物理顺序与叶节点从左到右的逻辑顺序相匹配,因此可提高索引扫描性能。

注意

运行 DBCC INDEXDEFRAG 时,索引碎片整理是串行进行的。这表示对单个索引的 *** 作是使用单个线程执行的。没有发生并行 *** 作。同样,在同一个 DBCC INDEXDEFRAG 语句中对多个索引的 *** 作是一次对一个索引执行的。

DBCC INDEXDEFRAG 还压缩索引页,并考虑创建索引时指定的填充因子。任何因这种压缩而创建的空页将被删除。有关详细信息,请参阅 填充因子。

如果索引跨越多个文件,则 DBCC INDEXDEFRAG 一次对一个文件进行碎片整理。不会在文件之间迁移页。

DBCC INDEXDEFRAG 每五分钟就报告完成的估计百分比。可在进程中的任一点停止 DBCC INDEXDEFRAG,任何已完成的工作都将保留。

与 DBCC DBREINDEX(或通常的索引生成 *** 作)不同,DBCC INDEXDEFRAG 是联机 *** 作。它不长期保持锁。因此,DBCC INDEXDEFRAG 不会阻塞运行查询或更新。因为碎片整理所需的时间与碎片整理的级别相关,若索引的碎片相对较少,则该索引的碎片整理速度比生成一个新索引要快。对碎片太多的索引进行整理可能要比重建索引花更多的时间。

始终对碎片整理进行完整的日志记录,与数据库恢复模式设置无关。有关详细信息,请参阅 ALTER DATABASE (Transact-SQL)。对碎片太多的索引进行整理所生成的日志可能比完全记录的索引创建多。但是,碎片整理是作为一系列短事务执行的,因此如果经常进行日志备份或恢复模式设置为 SIMPLE,则不需要大日志。

限制

DBCC INDEXDEFRAG 打乱了已有的索引叶级页。因此,如果索引与磁盘上的其他索引交叉,则针对该索引运行 DBCC INDEXDEFRAG 不使索引中的所有叶级页连续。若要改善页的聚集,请重建索引。

DBCC INDEXDEFRAG 不能用于对以下索引进行碎片整理:

已禁用的索引。

页锁定设置为 OFF 的索引。

空间索引。

不支持对系统表使用 DBCC INDEXDEFRAG。

结果集
如果在语句中指定索引(除非指定了 WITH NO_INFOMSGS),DBCC INDEXDEFRAG 返回以下结果集(值可能不同):

Pages Scanned Pages Moved Pages Removed------------- ----------- -------------359           346         8(1 row(s) affected)DBCC execution completed. If DBCC printed error messages,contact your system administrator.
权限
调用方必须是表所有者,或是 sysadmin 固定服务器角色、db_owner 固定数据库角色或 db_ddladmin 固定数据库角色的成员。

示例
A. 使用 DBCC INDEXDEFRAG 对索引进行碎片整理

以下示例对 AdventureWorks2008R2 数据库的 Production.Product 表中的 PK_Product_ProductID 索引的所有分区进行碎片整理。

Transact-SQL
DBCC INDEXDEFRAG (AdventureWorks2008R2,"Production.Product",PK_Product_ProductID)GO
B. 使用 DBCC SHOWCONTIG 和 DBCC INDEXDEFRAG 对数据库中的索引进行碎片整理

以下示例将展示一种简单的方法,该方法可用于对数据库中碎片数量在声明的阈值之上的所有索引进行碎片整理。

/*Perform a 'USE <database name>' to select the database in which to run the script.*/-- Declare variablesSET NOCOUNT ON;DECLARE @tablename varchar(255);DECLARE @execstr   varchar(400);DECLARE @objectID  int;DECLARE @indexID   int;DECLARE @frag      decimal;DECLARE @maxfrag   decimal;-- DecIDe on the maximum fragmentation to allow for.SELECT @maxfrag = 30.0;-- Declare a cursor.DECLARE tables CURSOR FOR   SELECT table_SCHEMA + '.' + table_name   FROM informatION_SCHEMA.tableS   WHERE table_TYPE = 'BASE table';-- Create the table.CREATE table #fragList (   Objectname char(255),ObjectID int,Indexname char(255),IndexID int,Lvl int,CountPages int,CountRows int,MinRecSize int,MaxRecSize int,AvgRecSize int,ForRecCount int,Extents int,ExtentSwitches int,AvgFreeBytes int,AvgPageDensity int,ScanDensity decimal,BestCount int,ActualCount int,LogicalFrag decimal,ExtentFrag decimal);-- Open the cursor.OPEN tables;-- Loop through all the tables in the database.FETCH NEXT   FROM tables   INTO @tablename;WHILE @@FETCH_STATUS = 0BEGIN-- Do the showcontig of all indexes of the table   INSERT INTO #fragList    EXEC ('DBCC SHOWCONTIG (''' + @tablename + ''')       WITH FAST,tableRESulTS,ALL_INDEXES,NO_INFOMSGS');   FETCH NEXT      FROM tables      INTO @tablename;END;-- Close and deallocate the cursor.CLOSE tables;DEALLOCATE tables;-- Declare the cursor for the List of indexes to be defragged.DECLARE indexes CURSOR FOR   SELECT Objectname,ObjectID,IndexID,LogicalFrag   FROM #fragList   WHERE LogicalFrag >= @maxfrag      AND INDEXPROPERTY (ObjectID,Indexname,'IndexDepth') > 0;-- Open the cursor.OPEN indexes;-- Loop through the indexes.FETCH NEXT   FROM indexes   INTO @tablename,@objectID,@indexID,@frag;WHILE @@FETCH_STATUS = 0BEGIN   PRINT 'Executing DBCC INDEXDEFRAG (0,' + RTRIM(@tablename) + ',' + RTRIM(@indexID) + ') - fragmentation currently '       + RTRIM(CONVERT(varchar(15),@frag)) + '%';   SELECT @execstr = 'DBCC INDEXDEFRAG (0,' + RTRIM(@objectID) + ',' + RTRIM(@indexID) + ')';   EXEC (@execstr);   FETCH NEXT      FROM indexes      INTO @tablename,@frag;END;-- Close and deallocate the cursor.CLOSE indexes;DEALLOCATE indexes;-- Delete the temporary table.DROP table #fragList;GO
总结

以上是内存溢出为你收集整理的DBCC大全集之(适用版本MS SQLServer 2008 R2)----DBCC INDEXDEFRAG指定表或视图的索引碎片整理全部内容,希望文章能够帮你解决DBCC大全集之(适用版本MS SQLServer 2008 R2)----DBCC INDEXDEFRAG指定表或视图的索引碎片整理所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1171987.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存