我在 SQL Server 2019 的一个表中有一个数据库,其中包含大量 varbinary(MAX) 重复记录。我们需要删除重复项,因此我运行了删除查询来删除重复项。数据库大小在删除语句之前没有保持不变,而是在查询完成后增加。我即将应用 DBCC SHRINKFILE(N'myDatabase', 0),但我真的很好奇为什么数据库大小会增加。附件是我的删除查询。
DELETE from Document WHERE DocumentId in
(
SELECT t.DocumentId
FROM (
SELECT s.*,
ROW_NUMBER() OVER (PARTITION BY s.DocumentName, s.SubmitDateTime, s.DocumentType ORDER BY s.DocumentName, s.SubmitDateTime, s.DocumentType) AS [RowCount]
FROM Document s
LEFT OUTER JOIN Staging b ON s.DocumentId = b.DocumentId
LEFT OUTER JOIN RejectTable r ON s.DocumentId = r.DocID
WHERE b.DocumentId IS NULL
AND r.DocID IS NULL
AND s.SubmitDateTime IS NOT NULL
AND s.InsertDateTime IS NOT NULL
AND s.DocumentName IS NOT NULL
AND s.DocumentContent IS NOT NULL
AND s.Description ='EmployeesDocument'
) t
WHERE t.[RowCount] > 1
)
当你说数据库文件大小增加时,你在看什么?
我预计日志文件大小会增加,但在事务结束时(如果处于简单恢复模式)应该大部分为空,或者在最近的日志备份之后为空(如果处于批量/完整恢复模式)。
但是,无论哪种情况,数据库都不会将文件空间释放回操作系统,除非您运行收缩文件。请仅将此作为一次性操作执行,以缩小到合理的大小,并在完成后注意对索引进行碎片整理。
如果 dbo.Document 是堆,那么您还有一个额外的考虑因素。在重建表之前,堆通常不会释放已删除记录的空间。请参阅这个优秀的答案以获得有关此问题的进一步帮助 - How to reclaim the storage spaceused by a heap?