使用 Microsoft SQL Server 2016 (RTM) - 13.0.1601.5 (X64) Express Edition(64 位)
我有一个每月达到最大空间(10Gb)的数据库。
为了腾出一些空间,我做了一个 bacpac,用 bacpac 创建一个新数据库并将其缩小 2 次。
数据库从 10Gb 变为 6Gb,使用该数据库的应用程序变得更快(我认为 bacpac 会刷新索引)。
是否有执行此操作的 SQL 命令?我可以在生产数据库中执行此操作吗?
使用 Microsoft SQL Server 2016 (RTM) - 13.0.1601.5 (X64) Express Edition(64 位)
我有一个每月达到最大空间(10Gb)的数据库。
为了腾出一些空间,我做了一个 bacpac,用 bacpac 创建一个新数据库并将其缩小 2 次。
数据库从 10Gb 变为 6Gb,使用该数据库的应用程序变得更快(我认为 bacpac 会刷新索引)。
是否有执行此操作的 SQL 命令?我可以在生产数据库中执行此操作吗?
您当前的流程不应该真正改变应用程序的性能(尤其是对于如此少量的数据),但是您的数据库可能会出现严重的索引碎片,并且创建新数据库会导致索引被重建。(如果没有更多信息,例如由于您的流程而改进的特定查询的执行计划之前和之后的执行计划,我们将无法确定这一点。)
在任何情况下,您都可以在现有数据库上运行相同的收缩命令,无需每次都导出和重新创建全新的数据库。尽管通常不建议缩小数据库,但在您的用例中,每个数据库只能绑定 10 GB,我理解这样做的潜在需要。
从长远来看,我希望重新构建您的应用程序和数据库,以尽可能使用多个数据库并且合乎逻辑,以此作为解决 SQL Server Express 中 10 GB 硬性上限的一种方法。(例如,仅将某个数据库中的某些相关表分组,并将其他数据库中的其他相关表组分组,或者将事务繁重的表与更改较少的表分离,以另一种方式对其进行切片。)始终允许跨数据库查询。或者您可能会发现最终购买小型标准版许可证是值得的。
此外,您可能需要考虑将数据库切换到简单恢复模式,这将通过自动回收事务日志中使用的空间来减少所需的空间量。这可能是您在运行收缩命令时使用当前进程回收的所有空间,因此可能不再需要运行该命令。
关于保持索引碎片整理,您应该阅读 Microsoft 的 BOL:优化索引维护以提高查询性能并减少资源消耗,然后您可以查看 Ola Hallangren 的SQL Server 索引和统计维护,这将帮助您自动化该过程以确保您的索引得到维护。
所有这些都可以在生产环境中运行,但我的建议是始终先在开发环境中进行测试,提出可行的游戏计划,然后在生产环境中实施。
重建索引应该会达到类似的效果,但请考虑将最大的表设为聚集列存储,或使用表和索引压缩。
您需要应用最新的服务包才能获得这些功能,但无论如何您都需要这样做,因为 SQL Server 2016 RTM 早已不再受支持。
请注意,列存储段缓存限制为每个实例 352MB,但这是一个额外的好处,与通常的 Express 1410MB 缓冲池限制不同。这不会限制列存储对象的大小,仅限制专用段缓存的最大大小。
总之,Express 2016 SP1+ 仅限于:
有关更多详细信息,请参阅: