了解SQL Server DBCC DBREINDEX命令及其用法

1,312 阅读4分钟

在这篇文章中,我将解释DBCC DBREINDEX语句,它的语法和用法。此外,我还将介绍DBCC REINDEX和ALTER INDEX语句之间的区别。

DBCC REINDEX语句是用来重建表的一个或多个索引的。

语法

DBREINDEX语句的语法如下。

DBCC DBREINDEX   
(   
    tbl_name   
    [ , indx_name [ , fill_factor ] ]  
)

在语法上。

  1. tbl_name:指定包含一个或多个你想重建的索引的表的名称
  2. Index_name:指定你要重建的索引的名称。如果你指定了索引,那么你必须在tbl_name参数中指定表的名称。如果你没有指定索引名称,那么该表的所有索引都将被重建。
  3. fill_factor:指定索引的填充因子。fillfactor是你想用来存储索引页上的数据的百分比空间
    1. 当我们在DBREINDEX语句中指定fillfactor时,它将取代索引的fillfactor的旧值。
    2. 当你想指定fillfactor时,你必须指定表名和索引名。
    3. 如果你没有指定fillfactor的值,DBREINDEX语句会使用fillfactor的默认值,即100。

需要的权限

要执行dbcc dbreindex命令,用户必须是sysadmin(固定服务器角色)、db_owner(固定数据库角色)或者db_ddladmin(固定数据库角色)的成员。

重要说明。

  1. dbcc dbreindex语句已被废弃,并将在未来的SQL Server版本中停止使用。它被ALTER INDEX语句所取代,后者提供了更多的灵活性和配置选项。
  2. 由DBREINDEX语句执行的索引重建操作是离线的。如果你正在重建一个非聚类索引,它将共享锁放在表上,以限制更新语句的执行。如果你正在重建聚类索引,它放置独占锁来限制对表的访问(SELECT语句)。你可以使用ALTER INDEX语句来执行在线索引重建,为索引重建操作配置MAXDOP
  3. DBREINDEX语句更新与索引相关的统计数据,用户创建的统计数据和自动创建的统计数据。为了更新统计数据,它使用默认的采样率
  4. 我们不能使用DBREINDEX重建下列对象的索引
    1. 系统表
    2. 内存优化的列库索引
    3. 空间索引

实例

为了演示DBCC DBREINDEX的用法,我使用了wideworldimportors数据库,所以我从这里下载了它并在我的工作站上恢复了它。让我们来探讨一下DBREINDEX语句的各种例子。首先,让我们填充碎片化程度高于30%的索引列表。下面的查询是用来填充碎片化的索引的。

use [WideWorldImporters]
go
SELECT Sch.name as 'Schema',
Tbls.name as 'Table',
Indx.name as 'Index',
indexstat.avg_fragmentation_in_percent
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL) AS indexstat
INNER JOIN sys.tables Tbls on Tbls.object_id = indexstat.object_id
INNER JOIN sys.schemas Sch on Tbls.schema_id = Sch.schema_id
INNER JOIN sys.indexes Indx ON Indx.object_id = indexstat.object_id
AND indexstat.index_id = Indx.index_id
WHERE indexstat.database_id = DB_ID()
and Indx.name is not null
AND indexstat.avg_fragmentation_in_percent > 30
AND Indx.name not like 'FK%'
ORDER BY indexstat.avg_fragmentation_in_percent desc

image.png

例1:重建Sales.OrderLines表的所有索引

下面的命令重建了Sales.OrderLines表的所有索引。

use WideWorldImporters
go
dbcc dbreindex ('Sales.OrderLines')

image.png

例2:用fillfactor重建表的一个特定索引

下面的命令重建了 IX_Application_People_IsEmployee的索引**,**填充因子为70。

use WideWorldImporters
go
dbcc dbreindex ('Application.People','IX_Application_People_IsEmployee',70)

image.png

DBCC DBREINDEX语句和ALTER INDEX REBUILD之间的区别

下面是DBCC DBREINDEX语句和ALTER INDEX REBUILD语句之间的区别。

DBCC DBREINDEX

alter index rebuild

它不支持在线索引重建。

它支持在线索引重建。这个功能只在企业版中可用。

它不支持可恢复的索引。

它支持可恢复的索引。

它没有提供一个在索引重建操作中使用MAXDOP的选项。

我们可以使用MAXDOP来重建索引。

语句更新用户定义的、自动创建的统计信息,它也更新与索引相关的统计信息。

它更新了与索引相关的统计数据。我们必须创建一个单独的维护作业来更新用户定义的和自动生成的统计数据。

结论

正如我提到的,这是一个废弃的语句,所以在未来的SQL Server版本中,它将被停止使用。作为一个主动的步骤,我们必须改变所有的维护计划和用于重组和重建索引的定制脚本。该语句的代码要简单得多。你可以在一条语句中重建所有的索引,所以用它来创建一个索引重建脚本是非常容易的。如果你看一下该命令的语法,你没有得到任何调整索引重建任务的选项,最糟糕的是你不能使用最大并行度(MAXDOP)选项,也不能在系统在线时重建索引。

总结

在这篇文章中,我们通过演示实际的例子,探讨了DBCC DBREINDEX语句和它的用法。此外,我们还学习了DBCC DBREINDEX语句和ALTER INDEX REBUILD语句之间的区别。