2013-02-14 59 views
2

我有一个SQL表,其中有773,705,261行的SQL表。我想创建一个归档表来存档数据,但是我想减少这些数据所需的空间。访问归档数据的速度并不是主要关心的问题,但总是需要。在SQL Server中为归档表节省空间

当前表的定义是这样的:

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 

有没有人对我有任何建议?我可以研究的任何方法?

回答

0

设置您的存档表以使用页面压缩。

从BOL

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

如果你不希望做任何更新或从存档表中删除(当然这不是假表的两端删除),那么我也将创建一个集群索引使用100%的填充因子。这样每个页面就不会留下任何空间。

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

0

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

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