SQL Server 2016 上的巨大堆表和表压缩

use*_*827 4 sql-server disk-space heap fragmentation compression

我的数据库很大,最近我注意到几个月前添加的新表是罪魁祸首。

这是表脚本。

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Entry_tracker](
    [S.Number] [int] IDENTITY(1,1) NOT NULL,
    [EntryId] [varchar](50) NOT NULL,
    [EventNumber] [varchar](18) NOT NULL,
    [Data] [varbinary](max) NOT NULL,
    [TrackDateTime] [datetime] NOT NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

ALTER TABLE [dbo].[Entry_tracker] ADD  CONSTRAINT [DF_Entry_tracker_TrackDateTime]  DEFAULT (getdate()) FOR [TrackDateTime]
GO
Run Code Online (Sandbox Code Playgroud)

我收集了这张表的信息,了解到该表大约有1600万行,表大小为1.4TB。在此处输入图片说明

尽管如此,我认为桌子的大小对于没有。的记录。

应用程序不查询该表。它只是存储来自另一个表的相同条目的不同版本。

我检查了碎片信息,它显示平均碎片为 0,平均空间使用率为 93%。 在此处输入图片说明

由于我使用的是 SQL Server 2016,我虽然可以使用表压缩,因此尝试sp_estimate_data_compression_savings估计可能的空间节省。但是,结果显示没有节省。

size_with_current_compression_setting(KB) 等于 size_with_requested_compression_setting(KB)

任何人都可以指导我找到这张表的问题吗?

这非常重要,因为这会占用大量磁盘空间。

感谢你的帮助。

Sea*_*ser 6

我仍然认为桌子的大小对于没有。的记录。

为什么?是什么让你这么说?

它的作用是存储来自另一个表的相同条目的不同版本。

所以它包含版本,可能大也可能小,特别是考虑到:

[Data] [varbinary](max) NOT NULL,

你有没有检查过datalength()这些行,看看那里的饮食空间是否有一些大行?

在我看来,根据数据,它给出的函数大小似乎是合理的。版本控制很少很小,除非它只是更改了字节,并且您使用各种算法来了解哪些字节、如何以及是否基于以前更改的版本构建。