2

我有一个 SQL 2008 表,表中有 773,705,261 行。我想创建一个存档表来存档数据,但我想减少这些数据所需的空间量。访问存档数据的速度不是主要问题,但始终是需要的。

当前的表定义是这样的:

TableID     (PK)    BIGINT      NOT NULL
DocumentID  (FK)    BIGINT      NOT NULL
StatusID    (FK)    INT         NOT NULL
RowCreateDate       DATETIME    NOT NULL

根据我的计算,当前表在表中每行使用 28 个字节。问题在于,对于每个 DocumentID,它在此表中可能有 6 到 10 行(每个 DocumentID 的行数将来也可能会增加),具体取决于系统处理的状态数量。

我减少存储这些数据所需空间量的第一个想法是为每个 DocumentID 设置 1 行,并拥有一个 XML 字段,其中包含所有 StatusID 和它们发生的时间。像这样的东西:

TableID     (PK)    BIGINT      NOT NULL
DocumentID  (FK)    BIGINT      NOT NULL
Statuses            XML         NOT NULL

有人对我有什么建议吗?有什么方法可以研究?

4

2 回答 2

0

将存档表设置为使用页面压缩。

来自 BOL

CREATE TABLE dbo.T1 
(c1 int, c2 nvarchar(200) )
WITH (DATA_COMPRESSION = PAGE);

如果您不希望从存档表中进行任何更新或删除(以及不在表两端的删除),那么我还将使用 100% 的填充因子创建聚集索引。这样一来,每一页都不会留下任何空间。

当然,在实际应用任何东西之前,我都会在 BOL 中查看两者。

于 2013-02-14T16:59:18.077 回答
0

您可能能够将INT数据类型用于 TableID 和 DocumentID,SMALLINTTINYINT用于 StatusID。根据 RowCreateDate 列所需的精度,您可以使用SMALLDATETIMEDATE。这些数据类型使用较少的磁盘空间,并会在 775,000,000 行中为您节省数 GB。

Kenneth 关于使用页面压缩和 FILLFACTOR = 100 的建议绝对值得考虑。

于 2013-02-14T18:53:18.487 回答