Sql-Server

具有多個葉級別的索引

  • October 31, 2012

我有一個具有三個葉級別的三列 ( 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將創建分配單元。這通常會給性能帶來問題,因為行數據訪問需要跟隨一個離頁指針來檢索溢出的數據。

我當然會先看看表格的設計,然後再過多地擔心頁面的平均填充量。是否應該關注頁面滿度取決於它所指的分配單元。

引用自:https://dba.stackexchange.com/questions/27912