You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server分区表:是否需将分区列显式加入索引键?

SQL Server 2019分区索引两种创建方式的差异分析

一、聚集索引的两种创建方式差异

当已定义分区函数与分区架构[PS_PartitionKey]时,创建聚集索引有两种可行写法,核心差异如下:

方式一:未显式将分区列加入索引键

CREATE CLUSTERED INDEX IX_1 ON t ([PKId] ASC ) 
ON [PS_PartitionKey]([PeriodID])

方式二:显式将分区列加入索引键

CREATE CLUSTERED INDEX IX_1 ON t ([PKId] ASC, [PeriodId] ASC ) 
ON [PS_PartitionKey]([PeriodID])
  • 索引键与存储结构:方式一的聚集索引键仅为PKId,但SQL Server会隐式把分区列PeriodId附加到索引的叶节点和非叶节点中(不作为排序键);方式二的索引键是PKId+PeriodId组合,PeriodId会参与索引的排序逻辑。
  • 数据排序规则:方式一中数据仅按PKId排序,分区列只是额外存储的字段;方式二中数据先按PKId排序,相同PKId的记录再按PeriodId排序,同时PeriodId决定数据归属的分区。
  • 唯一性保障:若PKId不是全局唯一值,方式一无法直接保证聚集索引唯一性,SQL Server会自动添加隐藏的唯一标识符;方式二通过PKId+PeriodId组合键,可直接确保索引唯一性(只要组合键本身唯一)。
  • 查询性能:当查询条件包含PeriodId时,方式二因为PeriodId是索引键的一部分,能直接利用排序优势快速过滤数据;方式一则需要通过隐式存储的PeriodId做额外过滤,效率略低。
  • 维护成本:方式二的索引键更长,会占用更多存储空间,数据插入、更新、删除时的索引维护开销比方式一略高。

二、非聚集索引的两种创建方式差异

前提是已创建包含分区列的聚集主键:

ALTER TABLE [dbo].t 
    ADD CONSTRAINT PK_t 
        PRIMARY KEY CLUSTERED ([PKId] ASC, [PeriodId]) ON [PS_PartitionKey]([PeriodID])

此时创建非聚集索引的两种写法差异如下:

方式一:未显式加入分区列

CREATE NONCLUSTERED INDEX IX_1 ON t ([ColA] ASC) 
ON [PS_PartitionKey]([PeriodID])

方式二:显式加入分区列

CREATE NONCLUSTERED INDEX IX_1 ON t ([ColA] ASC, [PeriodId] ASC) 
ON [PS_PartitionKey]([PeriodID])
  • 索引列组成:方式一的非聚集索引键仅为ColA,但由于聚集索引键是PKId+PeriodId,非聚集索引的叶节点会自动包含全部聚集索引键列(即PKId和PeriodId);方式二的索引键是ColA+PeriodId,叶节点同样会包含PKId。
  • 排序逻辑:方式一中索引仅按ColA排序,PeriodId是作为聚集索引键的一部分被隐式包含,不参与索引排序;方式二中索引先按ColA排序,相同ColA的记录再按PeriodId排序。
  • 查询适配性:如果查询同时过滤ColA和PeriodId,方式二可以直接通过索引键进行精准查找,无需额外读取隐式列;方式一则需要先通过ColA定位数据,再用隐式存储的PeriodId过滤。
  • 存储空间与维护:方式二的索引键多了PeriodId,索引体积更大,维护成本略高;但如果这类组合查询频繁,额外的存储开销能换来明显的性能提升。
  • 分区操作直观性:两种方式的索引都与表分区对齐,但方式二显式把分区列加入索引键,在分区切换等操作时逻辑更清晰,避免因隐式列导致的理解偏差。

内容的提问来源于stack exchange,提问作者SQL_Guy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 20:45:31