适用于:SQL Server
Azure SQL 数据库
Azure SQL 托管实例
本文介绍了解如何使用 SQL Server Management Studio 或 Transact-SQL 在 SQL Server 中收缩数据或日志文件。
收缩数据文件通过将数据页从文件末尾移动到更靠近文件开头的未占用的空间来恢复空间。 在文件末尾创建足够的可用空间后,可以取消对文件末尾的数据页的分配并将它们返回给文件系统。
警告
- 被移动用来收缩文件的数据可以分布到文件的任何可用位置。 这将导致索引碎片并使搜索索引范围的查询变慢。 若要消除碎片,请考虑在收缩后重新生成文件的索引。
- 收缩操作不应被视为常规维护操作。 由于常规定期业务操作而增长的数据和日志文件不需要收缩操作。
限制
- 主数据文件不能收缩到小于 model数据库中主文件的大小。
建议
- 在执行会产生大量未用存储空间的操作(如大型 DELETE 语句、截断表或删除表操作)后,执行收缩操作最有效。 
- 大多数数据库都需要一些可用空间,以供常规日常操作使用。 如果反复收缩数据库文件并注意到数据库大小再次变大,则表明常规操作需要可用空间。 在这种情况下,反复收缩数据库文件是一种无谓的操作。 增加数据库文件所需的自动增长事件会影响性能。 
- 被移动用来收缩文件的数据可以分布到文件的任何可用位置。 这将导致索引碎片并使搜索索引范围的查询变慢。 若要消除碎片,请考虑在收缩后重新生成文件的索引。 
- 除非有特定要求,否则不要将 AUTO_SHRINK 数据库选项设置为 ON。 
注解
正在进行的收缩操作可能会阻止针对数据库的其他查询,并且可能会被正在进行的查询阻止。 在 SQL Server 2022(16.x)中,引入了收缩文件操作的WAIT_AT_LOW_PRIORITY选项。 此功能是 DBCC SHRINKDATABASE 和 DBCC SHRINKFILE 的新附加选项。 如果在WAIT_AT_LOW_PRIORITY模式下的新收缩操作因已在进行中的长时间运行查询而无法获取必要锁,这收缩操作将在一分钟后超时并悄然退出,从而防止其他查询被阻塞。 
              WAIT_AT_LOW_PRIORITY 适用于数据文件(.mdf和 .ndf)。 不适用于事务日志文件。 有关详细信息,请参阅 DBCC SHRINKFILE (Transact-SQL)。
权限
要求具有 sysadmin 固定服务器角色或 db_owner 固定数据库角色的成员身份。
使用 SQL Server Management Studio (SSMS) 收缩数据或日志文件
- 在“对象资源管理器”中,连接到一个 SQL Server 数据库引擎实例,然后展开该实例。 
- 展开 “数据库” ,再右键单击要收缩的数据库。 
- 指向“任务”,指向“收缩”,然后选择“文件”。 - 数据库 
 显示所选 数据库的名称。- 文件类型 
 选择文件的文件类型。 可用的选项包括 “数据” 和 “日志” 文件。 默认选项为 “数据”。 选择不同的文件组类型,其他字段中的选项会相应地发生更改。- 文件组 
 在与以上所选的 “文件类型” 相关联的文件组列表中选择文件组。 选择不同的文件组,其他字段中的选项会相应地发生更改。- 文件名 
 从所选文件组和文件类型的可用文件列表中选择文件。- 位置 
 显示当前所选文件的完整路径。 此路径无法编辑,但可以复制到剪贴板。- 当前分配的空间 
 对于数据文件,会显示当前分配的空间。 对于日志文件,会显示根据- DBCC SQLPERF(LOGSPACE)的输出计算出的当前分配的空间。- 可用空间 
 对于数据文件,会显示根据- DBCC SHOWFILESTATS(fileid)的输出计算出的当前可用空间。 对于日志文件,会显示根据- DBCC SQLPERF(LOGSPACE)的输出计算出的当前可用空间。- 释放未使用的空间 
 将任何文件中未使用的空间释放给操作系统,并将文件收缩到最后分配的区,因此无需移动任何数据即可减小文件尺寸。 不会将行重新定位到未分配的页。- 在释放未使用的空间前重新组织页 
 等效于执行用于指定目标文件大小的- DBCC SHRINKFILE。 选中此选项时,用户必须在 “将文件收缩到” 框中指定目标文件的大小。- “将文件收缩到” 
 为收缩操作指定目标文件的大小。 此大小值不得小于当前分配的空间或大于为文件分配的全部区的大小。 如果输入的值超出最小值或最大值,那么一旦焦点改变或选中工具栏上的按钮时,数值将恢复到最小值或最大值。- 通过将数据迁移到同一文件组中的其他文件来清空文件 
 从指定文件迁移所有数据。 此选项允许使用- ALTER DATABASE语句删除文件。 此选项等效于执行带有- DBCC SHRINKFILE选项的- EMPTYFILE。 Azure SQL 数据库或 Azure SQL 数据库超大规模不支持- EMPTYFILE。
- 选择文件类型和文件名。 
- 根据需要,选中 “释放未使用的空间” 复选框。 - 选中此选项后,将为操作系统释放文件中所有未使用的空间,并将文件收缩到上次分配的区。 这将减小文件的大小,但不移动任何数据。 
- 根据需要,可以选中 “在释放未使用的空间前重新组织文件” 复选框。 如果选中此选项,则必须指定 “将文件收缩到” 值。 默认情况下,该选项为清除状态。 - 选中此选项后,将为操作系统释放文件中所有未使用的空间,并尝试将行重新定位到未分配页。 
- 根据需要,输入在收缩数据库后数据库文件中要保留的最大可用空间百分比。 值可以介于 0 和 99 之间。 只有启用 “在释放未使用的空间前重新组织文件” 以后,此选项才可用。 
- 根据需要,选中 “通过将数据迁移到同一文件组中的其他文件来清空文件” 复选框。 - 选中此选项后,将指定文件中的所有数据移至同一文件组中的其他文件中。 然后就可以删除空文件。 此选项与执行带有 EMPTYFILE 选项的 - DBCC SHRINKFILE相同。
- 选择“确定”。 
使用 Transact-SQL 收缩数据或日志文件
- 连接到 数据库引擎。 
- 在标准栏上,选择“新建查询”。 
- 将以下示例复制并粘贴到查询窗口中,然后选择“执行”。 此示例使用 DBCC SHRINKFILE (Transact-SQL) 将数据库中命名 - DataFile1- UserDB的数据文件的大小缩小到 7 MB。
USE UserDB;
GO
DBCC SHRINKFILE (DataFile1, 7);
GO