【问题标题】:LocalDB (mdf) compactionLocalDB (mdf) 压缩
【发布时间】:2014-04-03 15:37:34
【问题描述】:

我正在考虑在未来的项目中使用 LocalDB,而不是 OleDB (MDB)。

我需要不时压缩数据库吗?如果是,那么如何?

我发现在 SQL 数据库(MDF,对吗?)的情况下有一个 Shrink 选项,可以以某种方式定义自动收缩和修复。也许我不需要进行压缩(据我了解,这是创建新数据库并将实际内容复制到其中,因此所有 outdated 内容都将被删除),但以某种方式启用压缩就足够了(这是一个选项,以便服务器通过将 garbage 移动到数据库文件的末尾并截断文件来定期执行一种 garbage 收集

这也很有趣,收缩在文件系统碎片方面的效果如何(我的猜测不是很好)。

总而言之,我更喜欢压缩,如何执行压缩的想法(代码)以及如何确定何时需要压缩(执行压缩的标准)。

我明白了,有 BACKUP 命令,也许压缩看起来像:1)备份 2)重新创建数据库 3)从备份恢复?

【问题讨论】:

  • 您能否就您认为可能需要压缩的原因提供更多背景信息?我能想到的唯一原因是,如果您担心达到数据库大小限制,我认为 LocalDB 现在是 10GB。
  • MDF 限制为 16 TB,MDB - 2 Gb(tbh 不足)。我正在学习(大约 15 年前)什么数据库不会物理地删除记录,而是将它们标记为这样。也许还有其他操作,没有像他们认为的那样执行(索引、更新等)。因此,如果您进行大量更改 - 您的数据库将会增长,变得更慢,甚至可能会出现错误。在 MDB 的情况下,压缩是必须的,我知道如何使用 JRO 来做到这一点。但我没有找到与 MDF 相关的任何类似内容(或者我应该说 LocalDB,或者 SQL express?)。
  • 我尝试回答下面的问题,并添加了 sql-server 标签来吸引真正的专家来回答这个问题。

标签: c# sql-server localdb


【解决方案1】:

LocalDB 是 SQL Server Express,即 SQL Server。一般 SQL Server 指南通常也适用于 LocalDB,除非您有非常具体的情况。请注意,SQL Server Express(包括 LocalDB)对 MDF 文件大小有额外限制,在 SQL Server Express 2012 中为 10GB。

要记住的一点是,该格式旨在快速而不是紧凑。例如,一个空数据库将创建一个几 MB 大的 MDF 文件。

autogrowautoshrink 似乎是管理 MDF 大小的方法,如果你想尽可能地降低它。在this KB 315512 articlethis post by Paul Randall, including the discussion in comments 中讨论了与性能相关的权衡。

根据文件系统碎片 - 创建具有足够大文件大小的数据库应该会有所帮助,因为操作系统应该能够在一次询问时更轻松地找到大的连续磁盘空间块。当数据库文件增长和缩小时,它更有可能在文件系统级别出现碎片。我也找到了this post,讨论使用工具“手动”对给定文件进行碎片整理。看起来很有希望,但我还没有测试过。

【讨论】:

  • 感谢您的解释。现在变得更清楚了。你能确认一下,我不需要做任何事情来启用 autoshrink(使用 localdb,使用DataContext dbml 以编程方式创建数据库)?我可以忍受额外的 25%,害怕像 2000% =D
  • 我没有方便地安装 LocalDB 来测试它,但是一个简单的测试就足够了。只需创建一个数据库并查看autoshrink 选项的值。这应该有效:`select DATABASEPROPERTYEX('', 'IsAutoShrink')。详情:technet.microsoft.com/en-us/library/ms186823.aspx。显然,默认值将来可能会更改,因此您可以自己设置它,以确保在某些设置步骤中,具体取决于您的应用程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-29
  • 1970-01-01
相关资源
最近更新 更多