SQL/Windows 操作系统释放未使用的空间

2023-12-02

我最近对我的数据进行了一些归档,并执行了以下操作:

我的数据库表包含超过 3300 万条记录,其中许多是重复的。

我备份了表并将唯一数据插入到新表中,然后重命名/交换表名称,这实现了我所需要的。

然而现在我只剩下两张桌子了......

  • Table1(良好/活动表)- 1000 万条记录
  • Table1_Backup(备份表)- 3300万条记录

执行此操作后,我的 SQL mdf/数据文件已增加到 319.7 GB,我的日志文件已增加到 182 GB。

这占用了我的大部分可用操作系统空间,并且我的 D 驱动器现在空间不足。

我的问题是,一旦我对存档数据感到满意,我将删除 _backup 表,只留下我好的实时表。

但据我了解,SQL 不会给我任何可用空间给操作系统,从日志/mdf 文件中回收该空间的最佳方法是什么,我读过很多关于收缩 db/log 的内容,但很多人说这是不好的做法,任何建议都会很好......


TL;DR:不要收缩数据库。曾经。

但如果你确实需要缩小它怎么办?

根据 SQL Server 专家 Brent Ozar 上面链接的文章 - 在某些情况下,缩小数据库是一个合法的选择:

  • 您的数据库为 1TB 或更大
  • 您已删除 50% 的数据
  • 您有 500GB+ 的可用空间
  • 您永远不会需要该空间,因为您现在正在进行定期删除和存档

完整答案:

您写道您一直在阅读有关此内容的文章 - 所以我希望您遇到过类似的帖子布伦特·奥扎尔's 使用 DBCC SHRINKDATABASE 收缩数据库有什么不好?:

您的碎片很高,因此您需要重建索引。

这会留下大量空白空间,因此您会缩小数据库。

这会导致高碎片,因此您需要重建索引,这会导致数据库重新增长并再次留下空白空间,这样的循环就会持续下去。

迈克·沃尔什's 不要触摸 SQL Server 中的收缩数据库按钮!- 他解释了同样的事情:

缩小数据库时会发生什么?

当你收缩数据库时,你要求 SQL Server 从数据库文件中删除未使用的空间。SQL 使用的过程可能很丑陋,并导致索引碎片。从长远来看,这种碎片会影响性能。你已经释放了该空间,并让操作系统用它来做它需要做的事情,所以你至少得到了你所要求的。如果您的数据库不断增长,这意味着数据库将再次增长。根据您的自动增长设置,这种增长可能会超过必要的程度,最终您将再次缩小。充其量这只是额外的工作(收缩增长/收缩增长),并且生成的文件碎片可以很好地处理。更糟糕的是,这会导致索引碎片、文件碎片,并可能在收缩期间导致性能问题。

And 亚伦·伯特兰的回答SHRINKFILE 最佳实践和经验在 dba.StackExchange.com 上 - 他基本上是在说,您可以自由地忽略来自聪明、经验丰富的人的好建议,并假设您的情况有所不同 - 但您需要自担风险。这是他的结案陈词:

将文件缩小到 4GB,然后强制其增长以容纳新数据,这将是一项成本更高的操作。这就像清洗一条已经干净的毛巾,你将用它来擦去脏东西。

综上所述- 你真的、真的应该关注专家所写的内容。需要澄清的是:我并不认为自己是该主题的专家。
我对开发人员方面的 T-SQL 有着牢固的掌握,但我对 DBA 方面的经验很少 - 我可以用一只手数出我必须编写诸如维护计划、数据库迁移或处理任何事务之类的内容的次数。 DBA 会做的系统管理工作。
然而,我提到的所有这些人都是领先的 DBA:Brent Ozar 是 MCM(微软认证大师),Mike Walsh 是 9 次 MVP(自 2011 年以来),Aaron Bertrand 是 22 次 MVP(自 1997 年以来) - 这些人们真的知道他们在写什么。
我会在一周中的任何一天和周日两次接受他们中任何一个人的免费建议。

更新 - 关于日志文件:

缩小日志文件则有些不同——定期这样做是不好的做法。
日志文件大小基本上取决于您的备份策略和所选的恢复模型。

推荐阅读:迈克·沃尔什的在 dba.stackexchange 上自我回答的帖子- 如果您愿意,我建议您阅读他的完整答案以及 Aaron Bertrand 对同一篇文章的完整答案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL/Windows 操作系统释放未使用的空间 的相关文章

随机推荐

  • Windows 7 图标大小问题

    我正在尝试创建一个应用程序图标 我拿了一堆创建的 ico 文件 每个大小一个 并将它们组合成一个 ico 文件 我可以看到他们都很好 我有 16x16 32x32 48x48 64x64 和 128x128 图标 全部 32 位 带透明度
  • SwiftUI - NavigationLink 不适用于按钮

    我正在制作一个应用程序 在其中输入两个数字 并希望在单击按钮时在第二个屏幕中显示数字的相加结果 我可以在控制台中打印结果 但不幸的是 按钮周围的导航链接似乎不起作用 如果我将 NavigationLink 放在按钮标签周围而不是整个按钮周围
  • 如何从 Node.js 以编程方式运行“yarn tag”?

    我想从node js 以编程方式运行yarn 命令 但找不到任何sdk 或cli 实用程序 唯一的事情就是产生一个新的进程 但这很麻烦 截至 2019 年 1 月 Yarn 尚无可直接调用的 API 你cannot需要 Yarn 并使用类似
  • 在 wxPython 中绘图的最佳画布?

    我必须绘制组成物理网络拓扑模型的元素图 会有节点和拱门 后者可以是单向的或双向的 我想捕获节点和拱门的单击事件 以选择元素并在某处显示其属性 以及节点 以移动它们 和拱门 以连接或断开元素 的拖动事件 我做了一些研究 并将替代方案缩小到OG
  • 创建 Visual Studio 扩展时如何获取“源代码管理历史记录”窗口中的选定项目?

    我开发了一个Visual Studio 扩展 我将一个按钮附加到源代码管理历史记录窗口的上下文菜单 菜单上有 变更集详细信息 比较 等 我需要得到选定的历史项目从窗户看 但不知道该怎么做 Update 我使用 Team Foundation
  • 无法从客户端设备通过 C# 表单应用程序访问我的 SQL Server

    我有一个 C 应用程序连接到我的计算机上的在线服务器 当我在 Visual Studio 中测试我的应用程序时 它工作正常 但是当我将应用程序提供给客户端时 它无法工作 我在代码中直接在单击按钮事件中使用此连接字符串 Data Source
  • _app.getInitialProps 不会在每个请求上调用

    我正在根据主机名设置主题 一切都在开发模式下运行 但我只是跑了npm run build我看到了getInitialProps在构建期间被调用 我找不到任何有关何时的信息 app s getInitialProps被叫 我构建了整个应用程序
  • Git 分支名称 - 区分大小写还是不区分大小写?

    我是一个新的 git 用户 最近需要照顾一个过时的 git 存储库 这是原始状态 由 git show branch 输出 cr232 CR 232 Release dev Style Changes dev Style Changes d
  • 将 ListBox.SelectedObjectCollection 转换为 ListBox.ObjectCollection?

    是否可以将 ListBox SelectedObjectCollection 转换为 C 中的 ListBox ObjectCollection 如果是这样 我该怎么办 我有一个接受的函数List
  • robots.txt 中没有索引

    我总是阻止谷歌使用 robots txt 文件为我的网站建立索引 最近我读到了谷歌员工的一篇文章 他说你应该使用元标签来做到这一点 这是否意味着 Robots txt 不起作用 由于我正在使用 CMS 我的选择非常有限 并且仅使用 robo
  • 在 C# 中操作 Word 2007 文档 XML

    我正在尝试用 C 操作 Word 2007 文档的 XML 我已经设法找到并操作我想要的节点 但现在我似乎不知道如何将其保存回来 这是我正在尝试的 Open the document from memoryStream Package pk
  • 为什么我必须在自执行匿名函数之前添加分号? [复制]

    这个问题在这里已经有答案了 大多数情况下 Javascript 允许我们在语句末尾省略分号 然而 有趣的是 在这种情况下并非如此 var x 5 asdf function window alert Yay 除非我们在 anon 函数之前的
  • iOS 8 - 无法安装企业应用程序

    我们公司有一个应用程序 可以使用 Enterprise Distribution 通过网站下载 在 iOS 8 Beta 5 中 点击下载链接会弹出预期的弹出窗口 网站 想要安装 应用程序名称 在该对话框上点击 安装 首先会导致应用程序陷入
  • 如何将 Android 上的 SQLite 数据库备份/恢复到 Dropbox

    我目前正在开发一个使用 SQLite 数据库的 Android 应用程序 我正在寻找如何在 Dropbox 等外部服务之间备份 恢复数据库的想法 我已经进行了一些解释 如下所示 Android备份 恢复 如何备份内部数据库 在android
  • 该方法必须返回 int 类型

    public int computeStyle String season if season equals summer if this style equals toque return 8 if this style equals s
  • 将目录附加到 Windows 中的 PATH 环境变量

    所以 我有这个批处理文件 据说它将我的脚本附加到路径变量中 echo OFF setx path path cd script py 但我遇到了一些问题 附加我的 script py 将导致路径大于 1024 个字符 从而输出警告 警告 保
  • 如何在 dagger 2.10 中创建自定义作用域模块

    我正在尝试将公司应用程序迁移到 dagger 2 10 和AndroidInjector inject方法 但我想我发现了一个问题 该应用程序使用自定义作用域 就像登录功能一样 它有 3 个活动 每个活动都有自己的 dagger 模块 和一
  • 为什么双重检查锁定中使用易失性

    From 头先设计模式手册中 具有双重检查锁定的单例模式已实现如下 public class Singleton private volatile static Singleton instance private Singleton pu
  • 在 Windows 上使用 JDK 1.4 监控 Tomcat 5.5

    根据这个文档http tomcat apache org tomcat 5 5 doc monitoring html Enabling JMX Remote应该可以远程监控在 JDK 1 4 上运行的 Tomcat 5 5 服务器 但在搜
  • SQL/Windows 操作系统释放未使用的空间

    我最近对我的数据进行了一些归档 并执行了以下操作 我的数据库表包含超过 3300 万条记录 其中许多是重复的 我备份了表并将唯一数据插入到新表中 然后重命名 交换表名称 这实现了我所需要的 然而现在我只剩下两张桌子了 Table1 良好 活