Sqlserver:索引碎片的查詢


索引碎片:

  • 內部碎片(或說葉級填充率):反映數據葉級的空間占用率或空閑率
  • 外部碎片:由於sqlserver以連續的8個page作為一個數據庫塊(區)extent作為讀取單位,故此由於物理存儲上的區和邏輯上不一致(不連續)而造成io讀取切換

 

  • 邏輯碎片:這是索引的葉級頁中出錯頁所占的百分比。對於出錯頁,分配給索引的下一個物理頁不是由當前葉級頁中的“下一頁”指針所指向的頁
  • 區碎片:這是堆的葉級頁中出錯區所占的百分比。出錯區是指:包含堆的當前頁的區不是物理上的包含前一頁的區后的下一個區。(微軟真不會解釋概念:(

 

查詢碎片情況:

  1.   dbcc showcontig:四部分對象名,【索引名】|【索引id】
  2.   dbcc showcontig:當前庫對象id,【索引名】|【索引id】    
  3.   sys.dm_db_index_physical_stats:數據庫id,對象id,索引id,分區id,掃描模式
      • 五個參數,基本上,【0(特殊的,index可以為0,故該處為-1)】|【null】|【default】 意義是一樣的

 

基本指標:

  1. 掃描密度(%)[最佳計數:實際計數]:這是“最佳計數”與“實際計數”的比率。如果所有內容都是連續的,則該值為 100;如果該值小於 100,則存在一些碎片。“最佳計數”是指在一切都連續鏈接的情況下,區更改的理想數目。“實際計數”是指區更改的實際次數。
  2. 邏輯掃描碎片(%):掃描索引的葉級頁時返回的出錯頁的百分比。此數與堆無關。對於出錯頁,分配給索引的下一個物理頁不是由當前葉級頁中的“下一頁”指針所指向的頁。
  3. 區掃描碎片(%):掃描索引的葉級頁時出錯區所占的百分比。此數與堆無關。對於出錯區,包含當前索引頁的區在物理上不是包含上一個索引頁的區的下一個區。注意: 如果索引跨越多個文件,則此數字無意義。
  4. avg_page_space_used_in_percent:平均page空間使用率。相關的概念:頁拆分、頁填充率
  5. avg_fragment_size_in_pages:平均多少個page就有一個碎片,該值 越大越好
  6. avg_fragmentation_in_percent:碎片率,不解釋。該值越小越好,和avg_fragment_size_in_pages 反比!
  7. page_count:掃描的總page數
  8. record_count:掃描的總記錄數。注意:是相對於當前的掃描來說的記錄數,不一定是你所認為的 用戶表的一行數據
  9. forwarded_record_count:頁拆分的記錄數目

 

掃描方式

  索引、堆,因其本質為B數結構,B數是分層級的,故可以多種選擇來掃描:非頁級?or 僅取一代的樣本?or 完全的掃描?

 

函數的執行模式將確定為了獲取此函數所使用的統計信息數據而執行的掃描級別。mode 被指定為 LIMITED、SAMPLED 或 DETAILED。該函數遍歷分配單元的頁鏈,這些分配單元構成表或索引的指定分區。sys.dm_db_index_physical_stats 只需要一個意向共享 (IS) 表鎖,而忽略其運行所處的模式。有關鎖定的詳細信息,請參閱鎖模式。

LIMITED 模式運行最快,掃描的頁數最少。對於索引,只掃描 B 樹的父級別頁(即葉級別以上的頁)。對於堆,只檢查關聯的 PFS 和 IAM 頁;不掃描堆的數據頁。在 SQL Server 2005 中,在 LIMITED 模式下掃描堆的所有頁。

在 LIMITED 模式下,compressed_page_count 為 NULL,這是因為數據庫引擎只能掃描 B 樹的非葉頁和堆的 IAM 和 PFS 頁。使用 SAMPLED 模式可以獲取 compressed_page_count 的估計值,使用 DETAILED 模式可以獲取 compressed_page_count 的實際值。SAMPLED 模式將返回基於索引或堆中所有頁的 1% 樣本的統計信息。如果索引或堆少於 10,000 頁,則使用 DETAILED 模式代替 SAMPLED。

DETAILED 模式將掃描所有頁並返回所有統計信息。

從 LIMITED 到 DETAILED 模式,速度將越來越慢,因為在每個模式中執行的任務越來越多。若要快速測量表或索引的大小或碎片級別,請使用 LIMITED 模式。它的速度最快,並且對於索引的 IN_ROW_DATA 分配單元中的每個非葉級別,不返回與其對應的一行。

 

 

最佳實踐
請始終確保使用 DB_ID 或 OBJECT_ID 時返回了有效的 ID。例如,在使用 OBJECT_ID 時,請指定三部分的名稱,如 OBJECT_ID(N'AdventureWorks2008R2.Person.Address'),或者在 sys.dm_db_index_physical_stats 函數中使用由函數返回的值之前對這些值進行測試。下面的示例 A 和 B 演示了一種指定數據庫和對象 ID 的安全方法。

檢測碎片
在對表進而對表中定義的索引進行數據修改(INSERT、UPDATE 和 DELETE 語句)的整個過程中都會出現碎片。由於這些修改通常並不在表和索引的行中平均分布,所以每頁的填充度會隨時間而改變。對於掃描表的部分或全部索引的查詢,這種碎片會導致附加的頁讀取。從而延緩了數據的並行掃描。

SQL Server 2008 中的碎片計算算法比 SQL Server 2000 中的更精確。因此,碎片值顯得更高。例如,在 SQL Server 2000 中,如果一個表的第 11 頁和第 13 頁在同一區中,而第 12 頁不在該區中,該表不被視為含有碎片。但是訪問這些頁需要兩次物理 I/O 操作,因此,在 SQL Server 2008 中,這將算作碎片。

索引或堆的碎片級別顯示在 avg_fragmentation_in_percent 列中。對於堆,此值表示堆的區碎片。對於索引,此值表示索引的邏輯碎片。與 DBCC SHOWCONTIG 不同,這兩種情況下的碎片計算算法都會考慮跨越多個文件的存儲,因而結果是精確的。

邏輯碎片 
這是索引的葉級頁中出錯頁所占的百分比。對於出錯頁,分配給索引的下一個物理頁不是由當前葉級頁中的“下一頁”指針所指向的頁。

區碎片 
這是堆的葉級頁中出錯區所占的百分比。出錯區是指:包含堆的當前頁的區不是物理上的包含前一頁的區后的下一個區。

為了獲得最佳性能,avg_fragmentation_in_percent 的值應盡可能接近零。但是,從 0 到 10% 范圍內的值都可以接受。所有減少碎片的方法(例如重新生成、重新組織或重新創建)都可用於降低這些值。有關如何分析索引中碎片程度的詳細信息,請參閱重新組織和重新生成索引。

減少索引中的碎片
當索引分段的方式導致碎片影響查詢性能時,有三種方法可減少碎片:

1、刪除並重新創建聚集索引。
重新創建聚集索引將對數據進行重新分布,從而使數據頁填滿。填充度可以使用 CREATE INDEX 中的 FILLFACTOR 選項進行配置。這種方法的缺點是索引在刪除和重新創建周期內為脫機狀態,並且操作屬原子級。如果中斷索引創建,則不能重新創建索引。有關詳細信息,請參閱 CREATE INDEX (Transact-SQL)。

2、使用 ALTER INDEX REORGANIZE(代替 DBCC INDEXDEFRAG)按邏輯順序重新排序索引的葉級頁。由於這是聯機操作,因此在語句運行時仍可使用索引。中斷此操作時不會丟失已經完成的任務。此方法的缺點是在重新組織數據方面不如索引重新生成操作的效果好,而且不更新統計信息。


3、使用 ALTER INDEX REBUILD(代替 DBCC DBREINDEX)聯機或脫機重新生成索引。有關詳細信息,請參閱 ALTER INDEX (Transact-SQL)。


不需要僅因為碎片的原因而重新組織或重新生成索引。碎片的主要影響是,在索引掃描過程中會降低頁的預讀吞吐量。這將導致響應時間變長。如果含有碎片的表或索引中的查詢工作負荷不涉及掃描(因為工作負荷主要是單獨查找),則刪除碎片可能不起作用。有關詳細信息,請參閱此 Microsoft 網站。
注意: 
如果在收縮操作中對索引進行部分或完全移動,則運行 DBCC SHRINKFILE 或 DBCC SHRINKDATABASE 可能產生碎片。因此,如果必須執行收縮操作,則不應在刪除碎片后進行。
 


減少堆中的碎片
若要減少堆的區碎片,請對表創建聚集索引,然后刪除該索引。在創建聚集索引時將重新分布數據。同時會考慮數據庫中可用空間的分布,從而使其盡可能優化。當刪除聚集索引以重新創建堆時,數據不會移動並保持最佳位置。有關如何執行這些操作的信息,請參閱 CREATE INDEX 和 DROP INDEX。

壓縮大型對象數據
默認情況下,ALTER INDEX REORGANIZE 語句將壓縮包含大型對象 (LOB) 數據的頁。因為不會釋放空的 LOB 頁,所以在刪除大量 LOB 數據或 LOB 列時,壓縮此數據可改善磁盤空間使用情況。

重新組織指定的聚集索引將壓縮聚集索引中包含的所有 LOB 列。重新組織非聚集索引將壓縮作為索引中非鍵(已包括)列的所有 LOB 列。如果語句中指定 ALL,則將對與指定表或視圖關聯的所有索引進行重新組織。此外,將壓縮與聚集索引、基礎表或帶有包含列的非聚集索引關聯的所有 LOB 列。

評估磁盤空間使用狀況
avg_page_space_used_in_percent 列指示頁填充度。為了使磁盤使用狀況達到最優,對於沒有很多隨機插入的索引,此值應接近 100%。但是,對於具有很多隨機插入且頁很滿的索引,其頁拆分數將不斷增加。這將導致更多的碎片。因此,為了減少頁拆分,此值應小於 100%。使用指定的 FILLFACTOR 選項重新生成索引可以改變頁填充度,以便符合索引中的查詢模式。有關填充因子的詳細信息,請參閱填充因子。此外,ALTER INDEX REORGANIZE 還試圖通過將頁填充到上一次指定的 FILLFACTOR 來壓縮索引。這會增加 avg_space_used_in_percent 的值。請注意,ALTER INDEX REORGANIZE 不會降低頁填充度。相反,必須執行索引重新生成。

評估索引碎片
碎片由分配單元中同一文件內的物理連續的葉級頁組成。一個索引至少有一個碎片。索引可以包含的最大碎片數等於索引的頁級別頁數。碎片越大,意味着讀取相同頁數所需的磁盤 I/O 越少。因此,avg_fragment_size_in_pages 值越大,范圍掃描的性能越好。avg_fragment_size_in_pages 和 avg_fragmentation_in_percent 值成反比。因此,重新生成或重新組織索引會減少碎片數量,但同時增大碎片大小。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM