首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >启用1.5TB表上的页压缩

启用1.5TB表上的页压缩
EN

Database Administration用户
提问于 2017-07-31 15:25:17
回答 3查看 2.6K关注 0票数 5

我需要想出最好的方法来启用1500 GB的页压缩,其中有363,957,740行。数据库本身的大小为1.71TB,保存归档数据。

如果我正确理解,它需要磁盘空间(可能是相同数量的磁盘空间,只是为了更安全),这样它就可以在启用页面压缩的情况下创建表的副本并释放空间。这是在FULL恢复模型中,因此,它将被大量记录。

我已经和我的能力规划资源谈过了,他同意为这次维护提供额外的临时空间,并在这项活动完成后收回空间。说了这些之后,你认为最好的办法是:

  1. 采取完全备份
  2. 将备份还原到新的临时驱动器上。
  3. 将恢复模型更改为SIMPLE
  4. 启用页压缩
  5. 压缩后进行完全备份并恢复原始数据库
  6. 将恢复模型更改为FULL

另外,而不是启用页压缩。步骤3之后,截断最大的表,启用页压缩,然后执行

代码语言:javascript
运行
复制
SELECT * INTO ReplicaDB.dbo.ReplicaTbl

这是否启用了对现有索引的页压缩?

我没有测试环境来测试上述步骤。或者,如果有更好的方法可用,请告诉我。

其目标是尽量减少当前增长所需的未来磁盘空间。我们是一个ERP软件公司,我们有许可证企业版。只有在执行了一些检查并且所有数据都驻留在此表中时,此表才用于存档。我有2个指标(1个CI,1个非CI).没有一个列是VARCHAR (MAX),它们要么是NVARCHARintdate类型。

EN

回答 3

Database Administration用户

回答已采纳

发布于 2017-07-31 19:30:01

在表或索引级别上启用页压缩。您可以使用带有页压缩索引的未压缩表或具有未压缩索引的压缩表。如果希望对索引进行页面压缩,则需要单独执行。

我给人的印象是,这一举措最重要的考虑是能够归还所有分配给你的临时空间。对于你想要做的事情,SELECT INTO不是一个好的选择。该表将在未压缩的情况下构建,并且没有聚集索引。构建它需要一个REBUILD,它将增长您的数据文件,这正是您希望避免的。

以下是我要考虑的做法:

  1. 对旧数据库进行完全备份。
  2. 将备份还原到同一服务器上的临时数据库。
  3. 将恢复模型更改为临时数据库上的simple。
  4. 截断日志。
  5. 截断目标表。
  6. 使用页压缩聚集索引创建目标表,而不使用非聚集索引。
  7. 使用TABLOCK提示将旧数据库中的所有行插入目标表。这个操作可能需要很长的时间,但是应该尽可能少地记录,而不需要排序。
  8. 使用页面压缩一次生成一个非聚集索引。
  9. 切换到完全恢复模式。
  10. 采取充分的后援。在切换恢复模型之后这样做意味着您不必再进行另一次备份。
  11. 在原始数据库上还原临时数据库。
  12. 在测试完后,删除旧数据库的备份,并且您确信所有的数据都已检查完毕。
票数 5
EN

Database Administration用户

发布于 2017-07-31 15:39:34

你的计划听起来不错,除了这个:

另外,而不是启用页压缩。在步骤3之后,截断最大的表,启用页面压缩,然后在ReplicaDB.dbo.ReplicaTbl中执行SELECT *?

如果截断表并启用页压缩,则必须执行INSERT而不是SELECT INTO,此时应使用TABLOCK进行页压缩,而不仅仅是行压缩。

此外,用压缩进行重建比插入压缩表要快得多,我们在大型表上有3-5倍的差异。

在这里查看一下:数据加载性能指南数据加载性能指南,节数据压缩和大容量加载:

当数据大容量加载到压缩表或分区时,页级和行级压缩通常在大容量加载时间完成。但是,您应该注意到一个异常:当批量加载到页面压缩堆中时,必须使用TABLOCK提示来实现页面压缩。如果不使用TABLOCK提示,则只对堆进行行级压缩。在大容量目标上使用页面压缩通常会减慢大容量加载速度--特别是当I/O系统能够提供足够的速度使CPU饱和时。

票数 5
EN

Database Administration用户

发布于 2017-08-01 17:36:51

我想知道您的表是否是分区的(对这么大的表进行分区是有意义的)。

如果您的主要关注点是空间,那么可以分别压缩每个分区。如果平均有500个分区,则只有30-50GB。这种方法的另一个好处是可以更改分区子集的压缩,因此可以在不同的时间点进行压缩。

代码语言:javascript
运行
复制
ALTER INDEX <IX_Table_ClusteredIndex>
ON <Table> REBUILD PARTITION = 1 WITH (DATA_COMPRESSION = PAGE); 

下面是一个查询,它将为所有分区生成INDEX REBUILD

代码语言:javascript
运行
复制
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重新构建它。

票数 3
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/182275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档