2011-03-07 60 views

回答

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) 

你在找什麼在輸出稱爲掃描密度財產。這應該接近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) 
    ) 
+0

感謝Seth.I在數據庫表中的100和每個table.So不知道索引名其他任何方式做到這一點 – Pradeep 2011-03-07 09:50:54

+0

我已經添加了一個AUTOGEN腳本應該給你相同的腳本如上爲每個表和索引。 – Seth 2011-03-07 10:04:11

+1

更正了表別名。並在末尾添加了'so.name'作爲註釋,它幫助我快速定位到它指向的對象。你可以拋出一個'ORDER BY so.name',這個列表將按對象名排序。確實有用的腳本。 – Yaroslav 2013-03-16 01:07:03

7

如果您正在查找數據庫中所有索引和表的詳細信息,可以使用。

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> 
+0

我有一個索引重建作業運行了12個小時。運行完成百分比查詢並返回結果爲0. LOL。 – MaDDoG 2013-05-23 00:07:10

+0

@MDDDoG - 實際上看文檔看起來這個列只填充爲'ALTER INDEX REORGANIZE'。文檔也用來說'CREATE INDEX'更新了這一列,但看起來好像[該聲明現在已被刪除](https://connect.microsoft.com/SQLServer/feedback/details/641790/doc-sys- DM-EXEC-請求-話題是不一致的版本間) – 2013-05-23 07:16:03

1

一個關鍵的事情是將運行「索引物理統計」報告「由Top表磁盤使用」你重建索引之前和之後的報告。

在「索引物理統計」報告中,您可以看到每個索引是如何分散的。

要查看這些報告... *在Sql Server Management Studio中右鍵單擊數據庫 *將鼠標懸停在「報告」上,然後選擇「標準報告」,然後選擇所需報告。

對於您可以設置識別索引碎片和重建他們(更多信息)的腳本,檢查了這一點:

http://www.foliotek.com/devblog/sql-server-optimization-with-index-rebuilding/

0

你可以試試這個方法。它將重建數據庫中的所有表的索引,打印出結果,因爲它發展到你的管理工作室的消息窗格:

CREATE 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 '[email protected]+' 
    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 

你可以看到這個link以獲得更多關於重新索引link

注意頁面頂部的信息。