增加小数精度突然增加了表的大小

Dum*_*per 7 sql-server-2008 sql-server

我有一张像:

CREATE TABLE grid_rows(
    [grid_row_id] [int] NOT NULL,
    [grid_column_id] [smallint] NOT NULL,
    [decimal_val] [decimal](18, 6) NULL,
    [datetime_val] [datetime] NULL,
    [integer_val] [int] NULL,
    [string_val] [varchar](1024) NULL
)
Run Code Online (Sandbox Code Playgroud)

这张桌子有一些 1,037,560 rows

exec sp_spaceused "grid_rows" gives:
rows         reserved    data
1,037,560    461,768KB  302,648KB`
Run Code Online (Sandbox Code Playgroud)

将精度从 (18, 6) 更改为 (24,6) 后即 ALTER TABLE grid_rows ALTER COLUMN decimal_val decimal(24, 6)

exec sp_spaceused "grid_rows" gives:
rows         reserved     data
1,037,560    641,352KB  560,832KB
Run Code Online (Sandbox Code Playgroud)

根据所分配的空间decimal(18,6)就是9 bytes那的(24, 6)13 bytesMSDN参考

The reserved space has increased by around 179,584 KB and data space by 260,000KB. Shouldn't it be increased by 1,037,560 * 4/1024 = 4052 KB

Han*_*non 3

我只是使用DBCC IND和从存储随后修改为数据的数据DBCC PAGE的页面中读取物理数据。旧字段现在列为,另一个字段包含新数据。DECIMAL(4,2)DECIMAL(8,4)DROPPED

        CREATE TABLE TestDec
        (
            DecimalValue DECIMAL(4,2)
        );

        INSERT INTO TestDec VALUES (16.25);
        SELECT * FROM TestDec;

        EXEC sp_spaceused 'TestDec';

        DBCC IND('Test', 'TestDec', -1)

                    /* 20267501 happens to be the page in my database, yours WILL 
                       be different */
        DBCC TRACEON(3604) /* display output from DBCC PAGE */
        DBCC PAGE('Test',1,20267501,3) WITH TABLERESULTS

        ALTER TABLE TestDec ALTER COLUMN DecimalValue DECIMAL(8,4)
        DBCC PAGE('Test',1,20267501,3) WITH TABLERESULTS
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

第 46 行和第 47 行显示相关项目。

这表示当小数字段大小更改时,现有数据将复制到新的物理位置。

  • 是的,这肯定会导致页面拆分等。我相信您需要进行重建以恢复被删除的列占用的空间。 (4认同)