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
或旧式text
,ntext
或image
类型)和可变长度列的定义,以允许单个行超过8060字节INROW
的限制。
对于超过 8060 字节的行,ROW_OVERFLOW_DATA
将创建分配单元。这通常会影响性能,因为行数据访问需要遵循页外指针来检索溢出的数据。
我肯定会先看看表格的设计,然后再担心页面平均有多满。您是否应该关注页面填充度取决于它指的是哪个分配单元。