SQL Server 2005 - 奇数聚簇索引大小

jhs*_*ets 2 sql-server clustered-index

现有的表结构

CREATE TABLE [MYTABLE](
    [ROW1] [numeric](18, 0) NOT NULL,
    [ROW2] [numeric](18, 0) NOT NULL,
    [ROW3] [numeric](18, 0) NOT NULL,
    [ROW4] [numeric](18, 0) NULL,
    CONSTRAINT [MYTABLE_PK] PRIMARY KEY CLUSTERED ([ROW1] ASC, [ROW2] ASC, [ROW3] ASC)
)
Run Code Online (Sandbox Code Playgroud)

该表有2个非聚集索引,以及以下统计信息:

RowCount:    5260744
Data Space:  229.609 MB
Index Space: 432.125 MB
Run Code Online (Sandbox Code Playgroud)

我想减小索引的大小,并使用代理主键作为聚簇索引,而不是自然复合键.

新表结构

CREATE TABLE [dbo].[TEST_RUN_INFO](
    [ROW1] [numeric](18, 0) NOT NULL,
    [ROW2] [numeric](18, 0) NOT NULL,
    [ROW3] [numeric](18, 0) NOT NULL,
    [ROW4] [numeric](18, 0) NULL,
    [ID] [int] IDENTITY(1,1) NOT NULL,
    CONSTRAINT [MYTABLE_PK] PRIMARY KEY CLUSTERED ([ID] ASC)
)
Run Code Online (Sandbox Code Playgroud)

仍然只有2个非聚集索引,这是新的统计数据:

RowCount:    5260744
Data Space:  249.117 MB
Index Space: 470.867 MB
Run Code Online (Sandbox Code Playgroud)

有人可以解释使用3个NUMERIC(18,0)列的聚簇索引如何小于使用单个INT列的聚簇索引吗?

我在更改之前和之后重建了索引,并且两个结构的填充因子都设置为0.

两个非聚集索引是相同的,并且未更改为包含新ID列.

sys.dm_db_index_physical_stats

使用ID列获取的统计信息

复合聚簇索引

INDEX   TYPE            DEPTH   LEVEL   PAGECOUNT   RECORDCOUNT RECORDSIZE  
1       CLUSTERED       3       0       31884       5260744     47
1       CLUSTERED       3       1       143         31884       34
1       CLUSTERED       3       2       1           143         34
5       NONCLUSTERED    3       0       27404       5260744     40
5       NONCLUSTERED    3       1       167         27404       46
5       NONCLUSTERED    3       2       1           167         46
6       NONCLUSTERED    3       0       27400       5260744     40
6       NONCLUSTERED    3       1       164         27400       46
6       NONCLUSTERED    3       2       1           164         46
Run Code Online (Sandbox Code Playgroud)

INT聚集索引

INDEX   TYPE            DEPTH   LEVEL   PAGECOUNT   RECORDCOUNT RECORDSIZE  
1       CLUSTERED       3       0       31887       5260744     47
1       CLUSTERED       3       1       54          31887       11
1       CLUSTERED       3       2       1           54          11
5       NONCLUSTERED    4       0       29893       5260744     44
5       NONCLUSTERED    4       1       198         29893       50
5       NONCLUSTERED    4       2       3           198         50
5       NONCLUSTERED    4       3       1           3           50
6       NONCLUSTERED    4       0       29891       5260744     44
6       NONCLUSTERED    4       1       193         29891       50
6       NONCLUSTERED    4       2       2           193         50
6       NONCLUSTERED    4       3       1           2           50
Run Code Online (Sandbox Code Playgroud)

Mar*_*ith 5

聚簇索引叶子页包括表的所有列(而不仅仅是键列).通过添加代理主键,您只需将叶页中所有行的长度增加4个字节.将其乘以5,260,744行,相当于另外20 MB来存储ID列.

关键是更窄但是你可能会有更少的非叶级页面(用于sys.dm_db_index_physical_stats查看这个),并且由于聚簇索引键用作非聚簇索引中的行定位器,这可以使这些更小(但覆盖范围更小).