2009-11-17 144 views
1

我繼承的SQL Server 2005數據庫中的幾個鍵具有非常高的碎片百分比。如果使用下面的SQL:SQL Server 2005索引碎片

select OBJECT_NAME(object_id), avg_fragmentation_in_percent, record_count, * 
from sys.dm_db_index_physical_stats (DB_ID(N'FragmentedDB'), NULL, NULL, NULL, 'Detailed') s 

我看到幾個表50個99。這些表之間的分裂%,都超過10萬行,有的用2,000,000+。我相信這是造成顯著的性能問題,爲我們的應用程序,所以我試圖重建一些指標的用下面的SQL:

ALTER INDEX ALL ON [dbo].[FragmentedTable] 
REBUILD WITH (FILLFACTOR = 90, ONLINE = ON) 

然而,當我重建索引,並在破碎%再看看,他們都保持不變。有什麼我失蹤?我已經對這個主題進行了一些搜索,但到目前爲止已經空了。

謝謝!

+0

我也得到了同樣的事情發生。但是,當我使用Sql Management Studio檢查碎片(使用索引屬性)時,它顯示0.24%碎片的正確值。當我使用上面的方法時,它告訴我它是100%碎片。 – Kelly 2012-06-07 16:53:19

+0

你有沒有重組索引? – 2009-11-17 16:29:10

+0

是的,我也跑了: ALTER INDEX ALL ON [dbo]。[FragmentedTable] REORGANIZE – Blather 2009-11-17 16:31:13

回答

0

想起了幾件事 - 首先是如果您使用多個文件來備份表中的索引,那麼接下來將是重建索引時看到的並行性。接下來,你提你相信這是造成性能問題,你是否證實了這種情況?即有一些例外,對於掃描與尋找來說,碎片通常是更大的問題。有關碎片的詳細綜述,如何解決,集中在哪裏以及使用不同的修復方法看到的差異,請參見this series of blog posts

0

思考..

  • 難道是分區? REBUILD PARTITION = partition_number
  • 需要LOB_COMPACTION = ON
  • 你有聚集索引嗎?
+0

這時它不是分區。 我用LOB_COMPACTION = ON重新執行了我的查詢,沒有任何更改。 我的羣集和非羣集索引都遭受了我描述的碎片問題。 感謝您的回覆! – Blather 2009-11-17 16:49:25

1

您正在使用 '詳細' 與dm_db_index_physical_stats。這將顯示非葉級別以及索引的葉級別。

葉級別(leaf_level = 0),非葉級別(leaf_level> 0)或兩者的碎片?

如果碎片處於非葉級別,這不是一個問題,或沒有問題。

如果你仍然想擺脫所有的碎片,請嘗試添加PAD_INDEX。

0

已經有兩種刪除碎片的方法。這兩種方法是必要的,因爲它們具有完全不同的特徵。

介紹在SQL Server 2005以後的三種方法之間的區別:

ALTER INDEX ...重組​​(新DBCC INDEXDEFRAG)

ALTER INDEX ... REBUILD(新DBCC DBREINDEX)

ALTER INDEX ... REBUILD

獲取更多信息
http://sqlnetcode.blogspot.com/2011/11/sql-server-methods-for-removing.html

+0

鏈接不再有效 – 2013-02-20 11:46:47