启用行压缩时更改数据类型的影响

Ruu*_*ten 7 sql-server datatypes compression

我工作的公司有几个 SQL Server 数据库,其中的表包含 +- 500.000.000 行。我们正在运行 SQL Server 2008R2 和 2014 的企业版。

大数据类型

当我查看最大表中使用的数据类型时,我看到很多 BIGINT 列。使用Thomas Larock的脚本检查这些列中的数据并自己编写 MIN() 和 MAX() 值的脚本,我得出结论,这些 BIGINT 列中的数据可以很容易地装入 INT 甚至 SMALLINT/TINYINT 列中。(我知道有些列将来可能需要 BIGINT 的范围,所以我不会在没有先与开发人员交谈的情况下盲目更改所有数据类型)

在比较更改数据类型时可能的节省时,表似乎可能是当前大小的一半(甚至不考虑索引和其他表)。这些数字没有任何数据压缩。

行压缩

在大表上启用了 ROW 压缩。我想知道“缩小”列数据类型的实际影响可能是什么,请记住 ROW 压缩仅使用所需的字节。例如,如果一个值可以存储在 1 个字节中,则存储将只占用 1 个字节。

实际问题

是否有助于缩小数据类型,以便 ROW 压缩使用更少的资源?或者说“因为启用了 ROW 压缩,BIGINT、INT 或 SMALLINT 数据类型之间没有区别”是否可以保存?

spa*_*dba 4

正如您已经链接的文档所述,ROW 压缩仅使用所需的字节。一旦使用 ROW 压缩,用于从/到 int 或 bigint 转换的 CPU 周期是相同的:我不会担心这一点。

顺便说一句,如果您不确定 int/bigint 是否对数据库大小有影响(没有),您可以通过快速而肮脏的重现来亲自查看:

USE tempdb;
GO

CREATE TABLE SomeTable (
    SomeColumn bigint
)
GO

ALTER TABLE [dbo].[SomeTable] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = NONE);

INSERT INTO SomeTable 
SELECT TOP 10000000 ROW_NUMBER() OVER (ORDER BY(SELECT NULL))
FROM sys.all_columns AS A1
CROSS JOIN sys.all_columns AS A2;
GO

-- Rebuild the heap, so that pages compact nicely
ALTER TABLE dbo.SomeTable 
REBUILD 
WITH 
(
    MAXDOP = 1, 
    ONLINE = OFF,
    FILLFACTOR = 100,
    PAD_INDEX = OFF
);
GO

SELECT SUM(page_count)
FROM sys.dm_db_index_physical_stats(
        DB_ID(),
        OBJECT_ID('SomeTable'),
        DEFAULT,
        DEFAULT,
        'detailed'
    ) AS ips;


-- 21009 pages used


ALTER TABLE [dbo].[SomeTable] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = ROW);
GO


SELECT SUM(page_count)
FROM sys.dm_db_index_physical_stats(
        DB_ID(),
        OBJECT_ID('SomeTable'),
        DEFAULT,
        DEFAULT,
        'detailed'
    ) AS ips;

-- 13587 pages used


ALTER TABLE SomeTable ALTER COLUMN SomeColumn int;

-- Rebuild the heap, so that pages compact nicely
ALTER TABLE dbo.SomeTable 
REBUILD 
WITH 
(
    MAXDOP = 1, 
    ONLINE = OFF,
    FILLFACTOR = 100,
    PAD_INDEX = OFF
);
GO


SELECT SUM(page_count)
FROM sys.dm_db_index_physical_stats(
        DB_ID(),
        OBJECT_ID('SomeTable'),
        DEFAULT,
        DEFAULT,
        'detailed'
    ) AS ips;

-- 13587 pages used (same as bigint)
Run Code Online (Sandbox Code Playgroud)