在sql server上重建索引

Pra*_*eep 6 sql sql-server indexing sql-server-2008-r2

我在数据库上进行索引重建.我需要验证它是否已完成.有人可以指导我.我正在使用SQL Server 2008 R2

Mar*_*ith 7

如果要查找数据库中所有索引和表的详细信息,可以使用.

SELECT OBJECT_NAME(object_id),* 
FROM sys.dm_db_index_physical_stats(DB_ID(),NULL,NULL,NULL,'SAMPLED')
Run Code Online (Sandbox Code Playgroud)

我刚想到你可能也会问如何知道重新索引的进度.为此您可以使用

SELECT percent_complete 
from sys.dm_exec_requests 
where session_id= <spid of interest>
Run Code Online (Sandbox Code Playgroud)


Set*_*eth 1

如果您已成功地对表重新建立索引,则索引碎片将为零(如果您有热表,则接近零)。您可以使用此脚本检查碎片级别

DECLARE 
@IndexID int,
@TableID int,  
@IndexName varchar(256) 

--Enter index name here
SELECT @IndexName = '<index name>'
--Enter table name here
SET @TableID = OBJECT_ID('<table name>') 

SELECT @IndexID = IndID 
FROM sysindexes 
WHERE 
    id = @TableID 
    AND name = @IndexName 

DBCC SHOWCONTIG (@id, @IndexID)
Run Code Online (Sandbox Code Playgroud)

您在输出中寻找的是名为Scan Density 的属性。这应该接近 100%。如果没有,那么您的重新索引未完成/成功


如果您有很多表/索引,这可能会变得乏味,因此可以通过自动生成脚本来简化它,如下所示:

SELECT 'DBCC SHOWCONTIG ' +
    '(' 
       + CONVERT(varchar(32), si.id) + ',' 
       + CONVERT(varchar(32), si.indid) + 
    ')--'  + so.name
FROM sysobjects so 
INNER JOIN sysindexes si 
ON (so.id = si.id) 
WHERE (
    so.type = 'U' AND
    si.indid < 2 AND
    si.id = object_id(so.name) 
    )
Run Code Online (Sandbox Code Playgroud)