Sql-Server

截斷 200GB 表但未釋放磁碟空間

  • November 29, 2021

我只剩下 2GB,所以我需要刪除這個歷史表。這個表現在是空的,但是數據庫磁碟空間沒有釋放。數據庫文件為320GB。

如果您引用卷上的實際數據庫文件消耗,則SQL Server 不會自動處理。僅僅因為您從數據庫中刪除了數據並不意味著數據庫文件將縮小以僅適合現有數據。

如果您必須回收卷上的空間,您要尋找的是使用DBCC SHRINKFILE. 根據該文件,值得注意的是一些最佳實踐:

最佳實踐

當您計劃收縮文件時,請考慮以下資訊:

  • 在創建大量未使用空間的操作(如截斷表或刪除表操作)之後,收縮操作最有效。
  • 大多數數據庫都需要一些可用空間來進行日常日常操作。如果您反複收縮數據庫並註意到數據庫大小再次增長,這表明收縮的空間是正常操作所需的。在這些情況下,反複收縮數據庫是一種浪費的操作。
  • 收縮操作不會保留數據庫中索引的碎片狀態,並且通常會在一定程度上增加碎片。這是不重複收縮數據庫的另一個原因。
  • 按順序而不是同時收縮同一數據庫中的多個文件。系統表的爭用可能會因阻塞而導致延遲。

另外值得注意的是:

DBCC SHRINKFILE可以在流程中的任何時候停止操作,並保留任何已完成的工作。

執行此操作時肯定需要考慮一些事項,我建議您查看Paul Randal 的部落格文章,了解執行此操作時會發生什麼。

第一步肯定是驗證您實際能夠替換多少空間和可用空間,以及文件上的已用空間:

use AdventureWorks2012;
go

;with db_file_cte as
(
   select
       name,
       type_desc,
       physical_name,
       size_mb = 
           convert(decimal(11, 2), size * 8.0 / 1024),
       space_used_mb = 
           convert(decimal(11, 2), fileproperty(name, 'spaceused') * 8.0 / 1024)
   from sys.database_files
)
select
   name,
   type_desc,
   physical_name,
   size_mb,
   space_used_mb,
   space_used_percent = 
       case size_mb
           when 0 then 0
           else convert(decimal(5, 2), space_used_mb / size_mb * 100)
       end
from db_file_cte;

引用自:https://dba.stackexchange.com/questions/77489