我一直在阅读从停止压缩数据库文件链接的所有文章(和评论)。严重地。现在。我知道收缩是不好的。
我很难弄清楚的是如何在实际需要时正确地做。
背景故事是我继承了这个存档数据库,其中包含一些包含 PDF 的表格,这些表格应该在 5 年后过期,但是从未设置按计划执行此操作的程序。我目前没有行数,但它有几百万,大约 3TB。我估计其中一半将被删除并且永远不会回来。
我一直在与我们的基础架构提供商 DBA 交谈,但我发现他们提供的建议(删除、重建索引然后收缩)非常可疑。我是一名系统顾问而不是 DBA,但这次我似乎可以玩了:-/
1个
- 创建一个新的文件组
- 使用 CREATE INDEX … WITH (DROP_EXISTING = ON) ON 语法将所有受影响的表和索引移动到新文件组中,以同时移动表并从中删除碎片
- 删除您无论如何要缩小的旧文件组(如果它是主文件组,则将其缩小)
不幸的是,我无法访问只有 SSMS 的实际服务器,无论如何这都超出了我的舒适范围。我实际上不是DBA ..
2个
DBCC INDEXDEFRAG 或 ALTER INDEX …重组。
是的,但是如何......有相当多的参数可供选择,这似乎经过优化以使大小绝对最小,而不是我需要的是在保持数据库尽可能健康的同时消除膨胀。
换句话说,我不在乎数据库是否增长了一些,它需要空间来运行,并且随着文档产量的逐年增加,它会增长一些,但现在每晚、每周或每月的清除都会控制这一点。
我还应该补充一点,我可以在晚上毫不费力地使这个数据库脱机。
您的提供商 DBA 的推荐足以满足您的需求。但是,我会添加额外的检查步骤以确保您没有任何堆。当您从 Heaps 中删除记录时,空间并不总是可用的,您将没有重新组织它的好方法。如果可以,在删除之前(或之后,经销商选择)向堆添加聚簇索引。如果你不能,我会删除,添加一个聚簇索引,然后删除它。
所以,我的步骤是:
这将告诉您文件中实际使用了多少空间。
这就是他们可能推荐该顺序的原因:收缩操作只能重新组织并将完全空的 8k 页释放回操作系统。在此之前,您必须确保表和索引已将其内部可用空间释放回数据库。这就是重建索引(或碎片整理)的作用。
想想一个存储单元,其中每个“单元”是一个 8k 数据库页面:
收缩操作只会移动整个单元,但重建索引操作可以组合部分空单元(当然来自同一个表或索引)的内容。
现在这在很大程度上取决于您正在执行的删除类型。如果您要删除或截断整个表或删除大量的连续行,这些页面很可能会被完全清空,您可以在删除后立即进行收缩。(理想情况下,随后是重新索引以修复收缩帮助创建的碎片。)
在其他情况下,情况并非如此。假设您要删除十亿行表的每隔一行。很可能每个 8k 数据页仍然包含该表的一些行,并且在重新索引之前,您不会看到数据文件中报告的可用空间量有任何差异。
另一个相关示例:我最近在现有表中删除了一个非常大的列,并且由于每个数据页仍然有所有其他列,所以在重新索引之前我没有看到可用空间有任何差异。
在你的情况下,我不能确定,但由于你正在删除巨大的二进制值,这些页面中的许多页面似乎可能会被完全清空。删除后,只需仔细查看您的总内部可用空间即可。
我认为您需要在这里开始面对真正的问题:
虽然压缩对您没有多大作用,但有什么方法可以摆脱将 PDF 存储在数据库中并用指向磁盘位置的链接替换 blob 吗?