收缩数据库

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例

本文介绍如何使用 SQL Server Management Studio 或 Transact-SQL 在 SQL Server 中的对象资源管理器来收缩数据库。

收缩数据文件通过将数据页从文件末尾移动到更靠近文件开头的未占用的空间来恢复空间。 在文件末尾创建足够的可用空间后,可以取消对文件末尾的数据页的分配并将它们返回给文件系统。

警告

  • 被移动用来收缩文件的数据可以分布到文件的任何可用位置。 这将导致索引碎片并使搜索索引范围的查询变慢。 若要消除碎片,请考虑在收缩后重新生成文件的索引。
  • 收缩操作不应被视为常规维护操作。 由于常规定期业务操作而增长的数据和日志文件不需要收缩操作。

局限性

  • 数据库不能小于数据库的最小大小。 最小大小是在数据库最初创建时指定的大小,或是上一次使用文件大小更改操作(如 DBCC SHRINKFILE)设置的显式大小。 例如,如果数据库最初创建时的大小为 10 MB,后来增长到 100 MB,则该数据库最小只能收缩到 10 MB,即使已经删除数据库的所有数据也是如此。

  • 备份数据库时,无法收缩数据库。 反之,也不能在数据库执行收缩操作时备份数据库。

建议

  • 若要查看数据库中当前的可用(未分配)空间量。 有关详细信息,请参阅 显示数据库的数据和日志空间信息

  • 当您计划收缩数据库时,请考虑以下信息:

    • 在执行会产生大量未用存储空间的操作(如大型 DELETE 语句、截断表或删除表操作)后,执行收缩操作最有效。

    • 大多数数据库都需要一些可用空间,以供常规日常操作使用。 如果反复收缩数据库并注意到数据库大小再次增长,则表明常规操作需要可用空间。 在这种情况下,反复收缩数据库是一种无谓的操作。 增长数据库文件所需的自动增长事件会影响性能。

    • 收缩操作不保留数据库中索引的碎片状态,通常还会在一定程度上增加碎片。 这是不要反复收缩数据库的另一个原因。

    • 除非有特定的要求,否则不要将 AUTO_SHRINK 数据库选项设置为 ON

权限

要求具有 sysadmin 固定服务器角色或 db_owner 固定数据库角色的成员身份。

注解

正在进行的收缩操作可能会阻止针对数据库的其他查询,并且可能会被正在进行的查询阻止。 在 SQL Server 2022(16.x)中引入的收缩数据库操作有一个WAIT_AT_LOW_PRIORITY 选项。 此功能是 DBCC SHRINKDATABASEDBCC SHRINKFILE 的新附加选项。 如果在WAIT_AT_LOW_PRIORITY模式下的新收缩操作因已在进行中的长时间运行查询而无法获取必要锁,这收缩操作将在一分钟后超时并悄然退出,从而防止其他查询被阻塞。 有关详细信息,请参阅 DBCC SHRINKDATABASE

有关 Azure SQL 数据库中的文件管理和收缩操作,请参阅在 Azure SQL 数据库中管理数据库的文件空间

使用 SQL Server Management Studio

适用于:SQL Server,Azure SQL 托管实例

收缩数据库

  1. “对象资源管理器” 中,连接到 SQL Server 数据库引擎的实例,然后展开该实例。

  2. 展开“数据库”,再右键单击要收缩的数据库。

  3. 指向“任务”,指向“收缩”,然后单击“数据库”

    • 数据库

      显示所选 数据库的名称。

    • 当前分配的空间

      显示所选数据库的总已用空间和未使用空间。

    • 可用空间

      显示所选数据库的日志和数据文件中可用空间的总和。

    • 在释放未使用的空间前重新组织文件

      选择此选项相当于执行 DBCC SHRINKDATABASE 指定目标百分比选项。 清除此选项等效于使用TRUNCATEONLY选项执行DBCC SHRINKDATABASE。 在打开对话框时,默认情况下不选择此选项。 如果选择此选项,用户必须指定目标百分比选项。

    • 收缩后文件中的最大可用空间

      输入在数据库收缩后数据库文件中剩余可用空间的最大百分比。 值可以介于 0 和 99 之间。

  4. 选择“确定”

使用 Transact-SQL

收缩数据库

  1. 连接到 数据库引擎。

  2. 标准 栏中,选择“ 新建查询”。

  3. 将以下示例复制并粘贴到查询窗口中,然后选择“执行”。 此示例使用 DBCC SHRINKDATABASE (Transact-SQL) 来减小数据库中数据和日志文件 UserDB 的大小,并允许数据库中的 10 可用空间百分比。

DBCC SHRINKDATABASE (UserDB, 10);
GO

在收缩数据库之后

被移动用来收缩文件的数据可以分布到文件的任何可用位置。 这将导致索引碎片并使搜索索引范围的查询变慢。 若要消除碎片,请考虑在收缩后重新生成文件的索引。 有关详细信息,请参阅重新生成索引