具有多个叶级别的索引

Ale*_*arg 2 index sql-server clustered-index database-internals

我有一个具有三个叶级别的三列 ( 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: )
Run Code Online (Sandbox Code Playgroud)

Pau*_*ite 10

“我的问题是 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;
Run Code Online (Sandbox Code Playgroud)

输出:

????????????????????????????????????????????????????????????????????????????????????????????????????
? 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               ?
????????????????????????????????????????????????????????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

你的表包含大对象(LOB)列(MAX或旧式textntextimage类型)和可变长度列的定义,以允许单个行超过8060字节INROW的限制。

对于超过 8060 字节的行,ROW_OVERFLOW_DATA将创建分配单元。这通常会影响性能,因为行数据访问需要遵循页外指针来检索溢出的数据。

我肯定会先看看表格的设计,然后再担心页面平均有多满。您是否应该关注页面填充度取决于它指的是哪个分配单元。