我正在对数据库进行索引重建。 我需要验证它是否完成。 请有人指导我。 我正在使用SQL Server 2008 R2。
我正在对数据库进行索引重建。 我需要验证它是否完成。 请有人指导我。 我正在使用SQL Server 2008 R2。
SELECT OBJECT_NAME(object_id),*
FROM sys.dm_db_index_physical_stats(DB_ID(),NULL,NULL,NULL,'SAMPLED')
我想你可能也在问如何了解重新索引的进度。为此,您可以使用
SELECT percent_complete
from sys.dm_exec_requests
where session_id= <spid of interest>
http://www.foliotek.com/devblog/sql-server-optimization-with-index-rebuilding/
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)
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)
)
so.name
作为注释,这帮助我快速定位到它所指的对象。您可以使用 ORDER BY so.name
对列表进行排序。确实是一个有用的脚本。 - YaroslavCREATE PROCEDURE [dbo].[ReIndexDatabase]
AS
DECLARE @MyTable VARCHAR(255)
DECLARE myCursor
CURSOR FOR
SELECT table_name
FROM information_schema.tables
WHERE table_type = 'base table'
OPEN myCursor
FETCH NEXT
FROM myCursor INTO @MyTable
WHILE @@FETCH_STATUS = 0 BEGIN
PRINT 'Reindexing Table: ' + @MyTable
EXEC('ALTER INDEX ALL ON '+@MyTable+'
REBUILD WITH (FILLFACTOR = 80, SORT_IN_TEMPDB = OFF,
STATISTICS_NORECOMPUTE = ON)');
FETCH NEXT FROM myCursor INTO @MyTable
END
CLOSE myCursor
DEALLOCATE myCursor
EXEC sp_updatestats
请注意页面顶部的信息。
ALTER INDEX REORGANIZE
才会填充此列。文档曾经也说过CREATE INDEX
会更新此列,但看起来该说法现在已被删除。 - Martin SmithSELECT * FROM sys.dm_exec_query_statistics_xml(session_id)
,那么这可能会给你“在飞行中”的实际执行计划,并允许你查看进度,我还没有测试过。 - Martin Smith