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 bytes
。MSDN参考
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
我只是使用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 行显示相关项目。
这表示当小数字段大小更改时,现有数据将复制到新的物理位置。