Sql-Server
具有多個葉級別的索引
我有一個具有三個葉級別的三列 (
int
,smallint
,smallint
) 複合聚集索引。我的問題是 SQL Server 如何以及何時為同一索引創建多個葉級別(index_level 0)。我遇到了性能問題,我不能
avg_page_space_used_in_percent
超過 70%(葉頁數 1200,填充因子 80)。Microsoft SQL Server 2008 R2 (RTM) - 10.50.1617.0 (X64) Apr 22 2011 19:23:43 Copyright (c) Microsoft Corporation Developer Edition (64-bit) on Windows NT 6.1 <X64> (Build 7600: )
“我的問題是 SQL Server 如何以及何時為同一索引創建多個葉級別 (index_level 0)。”
sys.dm_db_index_physical_stats的 2008 R2 文件包含指向Table and Index Organization的連結,其中顯示了下圖:
它描述了可能儲存在三種可能的分配單元類型中的數據:
您的聚集索引確實包含三個葉級別,每個分配單元類型一個。例如:
CREATE TABLE dbo.Example ( example_id integer PRIMARY KEY, lob_data nvarchar(max) NULL, padding varchar(8000) NULL, overflow varchar(8000) NULL ); INSERT dbo.Example ( example_id, lob_data, padding, overflow ) VALUES ( 1, REPLICATE(CONVERT(nvarchar(max), N'X'), 8001), REPLICATE('Y', 4000), REPLICATE('Z', 6000) ); SELECT ddips.index_id, ddips.index_type_desc, ddips.alloc_unit_type_desc, ddips.index_level, ddips.avg_page_space_used_in_percent FROM sys.dm_db_index_physical_stats ( DB_ID(), OBJECT_ID('dbo.Example'), 1, 1, 'DETAILED' ) AS ddips;
輸出:
╔══════════╦═════════════════╦══════════════════════╦═════════════╦════════════════════════════════╗ ║ index_id ║ index_type_desc ║ alloc_unit_type_desc ║ index_level ║ avg_page_space_used_in_percent ║ ╠══════════╬═════════════════╬══════════════════════╬═════════════╬════════════════════════════════╣ ║ 1 ║ CLUSTERED INDEX ║ IN_ROW_DATA ║ 0 ║ 50.3953545836422 ║ ║ 1 ║ CLUSTERED INDEX ║ ROW_OVERFLOW_DATA ║ 0 ║ 74.3019520632567 ║ ║ 1 ║ CLUSTERED INDEX ║ LOB_DATA ║ 0 ║ 99.0239683716333 ║ ╚══════════╩═════════════════╩══════════════════════╩═════════════╩════════════════════════════════╝
您的表包含大型對象 (
LOB
) 列(或MAX
舊式text
或類型)和可變長度列定義,這些定義允許單個行超過 8060 字節的限制。ntext``image``INROW
對於超過 8060 字節的行,
ROW_OVERFLOW_DATA
將創建分配單元。這通常會給性能帶來問題,因為行數據訪問需要跟隨一個離頁指針來檢索溢出的數據。我當然會先看看表格的設計,然後再過多地擔心頁面的平均填充量。是否應該關注頁面滿度取決於它所指的分配單元。