小编nob*_*ght的帖子

DBCC SHRINKFILE 实际上在做什么?

我有一个大小为 11TB 的数据库。我最近从这个数据库中截断了超过 5TB 的数据。

(我完全熟悉您通常不会收缩数据库的所有原因)

我很好奇 DBCC SHRINKFILE 命令实际上在做什么,因为当我运行该命令来缩小一个大小约为 650000MB 且可用空间为 45% 的文件时,它似乎实际上并没有移动任何页面。

有问题的代码是:

USE [CAF] 
GO 
DBCC SHRINKFILE (N'FILENAME' , 650239) 
GO
Run Code Online (Sandbox Code Playgroud)

当我在执行 DBCC SHRINKFILE 时监视服务器的性能指标时,我看到以下内容

  • % 磁盘的活动时间立即跳到 100%。
  • sqlservr.exe 和系统进程都以连续 2MB/s 的速度开始读取(有时以 5MB/s 达到峰值)。
  • 磁盘队列长度直接跳到 1
  • 磁盘 iops 跳到 250 左右(注意测试中的磁盘可以达到 6000 iops) CPU 保持空闲

即使我告诉 DBCC SHRINKFILE 将文件缩小 1 MB 并让它运行 30 分钟,它也不会完成。

我读过的所有内容都表明 DBCC SHRINKFILE 应该从文件末尾获取页面并将它们移动到开头附近的可用空间,但即使在最差的性能下,移动 1MB 的页面也不会超过几分钟

DBCC SHRINKFILE 实际上在做什么,对我来说没有意义?

sql-server shrink

6
推荐指数
1
解决办法
1961
查看次数

标签 统计

shrink ×1

sql-server ×1