2010-02-16 110 views

回答

32

還有,你應該重新組織儘快索引碎片達到超過5(有時是10%)(「碎片整理」),你的指數普遍的共識,完全當它超越了30%,你應該重建它們(至少這是我在很多地方所倡導的數字)。

Michelle Ufford(又名「SQL傻瓜」)有一個automated index defrag script,它使用這些確切的限制來決定何時重新組織或重建索引。

另請參閱Brad McGehee's tips on rebuild indexes有關如何處理索引重建的一些很好的想法和提示。


我在這裏使用這個腳本(不記得,當我得到這個從 - 不管是誰:非常感謝真正有用的東西!)對給定數據庫中所有的指標顯示索引碎片:

SELECT 
    t.NAME 'Table name', 
    i.NAME 'Index name', 
    ips.index_type_desc, 
    ips.alloc_unit_type_desc, 
    ips.index_depth, 
    ips.index_level, 
    ips.avg_fragmentation_in_percent, 
    ips.fragment_count, 
    ips.avg_fragment_size_in_pages, 
    ips.page_count, 
    ips.avg_page_space_used_in_percent, 
    ips.record_count, 
    ips.ghost_record_count, 
    ips.Version_ghost_record_count, 
    ips.min_record_size_in_bytes, 
    ips.max_record_size_in_bytes, 
    ips.avg_record_size_in_bytes, 
    ips.forwarded_record_count 
FROM 
    sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'DETAILED') ips 
INNER JOIN 
    sys.tables t ON ips.OBJECT_ID = t.Object_ID 
INNER JOIN 
    sys.indexes i ON ips.index_id = i.index_id AND ips.OBJECT_ID = i.object_id 
WHERE 
    AVG_FRAGMENTATION_IN_PERCENT > 0.0 
ORDER BY 
    AVG_FRAGMENTATION_IN_PERCENT, fragment_count 
+0

布拉德麥吉的提示鏈接被打破。也許這是正確的鏈接,http://www.sql-server-performance.com/2007/rebuilding-indexes/ – 2017-08-31 16:14:40

1

鑑於數據庫的大小,您可以輕鬆地每月重建索引一次。但隨着規模的增加,比如說500GB左右,你可以每月做兩次。

+1

當然,取決於未完成交易的數量,類型和生存期。這可能是一個非常活躍的10GB數據庫。 – NTDLS 2010-02-16 19:29:47

4

「當你需要」和「當你可以」!

例如...

  • 試驗碎片第一,並決定是否什麼也不做,REORG或重建。 SQL Fool's script does this,例如,有@minFragmentation@rebuildThreshold參數

    每天
  • 進行統計,比如說,但指數在週末。你的維護窗口是什麼?

1

您應該經常重建索引,以免產品受到索引降級的不利影響。我知道這看起來很模糊,但所有的數據庫都不同,並且以不同的方式使用。您只需定期重建/整理引起寫操作(插入/更新)的索引 - 您的靜態或主要只讀表不需要太多重新索引。

您將需要使用dbcc showcontig([Table])來檢查索引的碎片級別,確定它們多久出現碎片以及碎片實際存在的級別。

使用dbcc dbreindex([Table])完全重建索​​引,當它們變得過於分散時(超過20%-30%左右),但如果找不到足夠大的停機時間並且碎片級別相對較低(1%-25%) ,您應該使用dbcc indexdefrag([Database], [Table], [Index])在「在線」活動中對索引進行碎片整理。另外請記住,您可以停止索引碎片整理操作,並在稍後再次啓動而不會丟失任何工作。保持數據庫及其索引「合理」需要一點監控才能真正感受何時以及要重新索引什麼。

+1

你不會在SQL Server 2005+中使用這3個DBCC命令中的任何一個 – gbn 2010-02-17 04:36:13

+0

我承認,學校的SQL人。請留下一些細節....啓發我。 – NTDLS 2010-02-17 05:05:11

+1

因爲它們從SQL Server 2005開始被標記爲已棄用,並且將在未來的版本中刪除。以下是提及此的2個網址:http://weblogs.sqlteam.com/tarad/archive/2007/02/26/60121.aspx&http://www.mssqltips.com/tip.asp?tip=1352和這裏是智慧的官方詞彙:http://msdn.microsoft.com/en-us/library/ms143729.aspx – 2010-02-17 08:40:24

相關問題