我需要想出最好的方法来启用1500 GB的页压缩,其中有363,957,740行。数据库本身的大小为1.71TB,保存归档数据。
如果我正确理解,它需要磁盘空间(可能是相同数量的磁盘空间,只是为了更安全),这样它就可以在启用页面压缩的情况下创建表的副本并释放空间。这是在FULL
恢复模型中,因此,它将被大量记录。
我已经和我的能力规划资源谈过了,他同意为这次维护提供额外的临时空间,并在这项活动完成后收回空间。说了这些之后,你认为最好的办法是:
SIMPLE
FULL
另外,而不是启用页压缩。步骤3之后,截断最大的表,启用页压缩,然后执行
SELECT * INTO ReplicaDB.dbo.ReplicaTbl
这是否启用了对现有索引的页压缩?
我没有测试环境来测试上述步骤。或者,如果有更好的方法可用,请告诉我。
其目标是尽量减少当前增长所需的未来磁盘空间。我们是一个ERP软件公司,我们有许可证企业版。只有在执行了一些检查并且所有数据都驻留在此表中时,此表才用于存档。我有2个指标(1个CI,1个非CI).没有一个列是VARCHAR (MAX)
,它们要么是NVARCHAR
、int
或date
类型。
发布于 2017-07-31 19:30:01
在表或索引级别上启用页压缩。您可以使用带有页压缩索引的未压缩表或具有未压缩索引的压缩表。如果希望对索引进行页面压缩,则需要单独执行。
我给人的印象是,这一举措最重要的考虑是能够归还所有分配给你的临时空间。对于你想要做的事情,SELECT INTO
不是一个好的选择。该表将在未压缩的情况下构建,并且没有聚集索引。构建它需要一个REBUILD
,它将增长您的数据文件,这正是您希望避免的。
以下是我要考虑的做法:
TABLOCK
提示将旧数据库中的所有行插入目标表。这个操作可能需要很长的时间,但是应该尽可能少地记录,而不需要排序。发布于 2017-07-31 15:39:34
你的计划听起来不错,除了这个:
另外,而不是启用页压缩。在步骤3之后,截断最大的表,启用页面压缩,然后在ReplicaDB.dbo.ReplicaTbl中执行SELECT *?
如果截断表并启用页压缩,则必须执行INSERT
而不是SELECT INTO
,此时应使用TABLOCK
进行页压缩,而不仅仅是行压缩。
此外,用压缩进行重建比插入压缩表要快得多,我们在大型表上有3-5倍的差异。
在这里查看一下:数据加载性能指南数据加载性能指南,节数据压缩和大容量加载:
当数据大容量加载到压缩表或分区时,页级和行级压缩通常在大容量加载时间完成。但是,您应该注意到一个异常:当批量加载到页面压缩堆中时,必须使用TABLOCK提示来实现页面压缩。如果不使用TABLOCK提示,则只对堆进行行级压缩。在大容量目标上使用页面压缩通常会减慢大容量加载速度--特别是当I/O系统能够提供足够的速度使CPU饱和时。
发布于 2017-08-01 17:36:51
我想知道您的表是否是分区的(对这么大的表进行分区是有意义的)。
如果您的主要关注点是空间,那么可以分别压缩每个分区。如果平均有500个分区,则只有30-50GB。这种方法的另一个好处是可以更改分区子集的压缩,因此可以在不同的时间点进行压缩。
ALTER INDEX <IX_Table_ClusteredIndex>
ON <Table> REBUILD PARTITION = 1 WITH (DATA_COMPRESSION = PAGE);
下面是一个查询,它将为所有分区生成INDEX REBUILD
:
SELECT ' ALTER INDEX ['+ i.name + '] ON [' + s.name + '].[' + o.name +
'] REBUILD PARTITION = ' + CONVERT(VARCHAR(MAX), p.partition_number) +
' WITH (DATA_COMPRESSION = PAGE, ONLINE = ON); '
FROM sys.partitions p
INNER JOIN sys.objects o
ON p.object_id = o.object_id
INNER JOIN sys.schemas s
ON o.schema_id = s.schema_id
INNER JOIN sys.indexes i
ON p.index_id = i.index_id
AND p.object_id = i.object_id
WHERE o.name = 'LargeTable'
ORDER BY p.partition_number
INDEX REBUILD
可以是最小记录操作最小记录操作。而且,由于您使用的是企业版,所以可以使用ONLINE = ON
重新构建它。
https://dba.stackexchange.com/questions/182275
复制相似问题