首页 > 解决方案 > Tempdb 在删除数百万条记录时增长

问题描述

我必须运行一个删除命令,删除近 400 万条记录。删除时注意到 tempdb 数据文件的增长与表大小一样多,并且会填满驱动器。

我的问题是:

  1. 由于我正在运行单个删除命令导致 tempdb 增长?
  2. 连接关闭时,tempdb中消耗的空间会自动清除吗?
  3. 我们有什么办法可以避免这种情况?

标签: sqlsql-serversql-server-2014

解决方案


一一回答你的问题:

  1. 由于我正在运行单个删除命令导致 tempdb 增长?

可能。当您正在运行一个巨大的 DML 操作时,缓冲区缓存中的一些数据被移动到 tempdb 以执行该操作,这导致了 tempdb 的增长。

  1. 连接关闭时,tempdb中消耗的空间会自动清除吗?

不,tempdb 不会自动收缩。重新启动数据库服务时,会重新创建 tempdb 并将重置为其原始大小。

  1. 我们有什么办法可以避免这种情况?

    • 您可以进行小批量的 UPDATE 操作。
DECLARE @rowCount INT 
SET @rowCount = (SELECT COUNT(*) FROM TableName WHERE ColumnName = 'Somevalue')


WHILE @rowCount <> 0
BEGIN
BEGIN TRANSACTION
UPDATE TableName
SET ColumnName = 'Newvalue'
WHERE PrimaryKeyId IN (select top 10000 PrimaryKeyId FROM TableName WHERE ColumnName = 'Somevalue');
COMMIT TRANSACTION;
SET @rowCount = (SELECT COUNT(*) FROM TableName WHERE ColumnName = 'Somevalue');
END
  • 尝试将 SELECT * INTO 转到另一个表,然后将新创建的表重命名为 current tableName
SELECT col1, updatedCol2
 INTO new_tableName
FROM tablename;

sp_rename tablename, old_tablename
sp_rename new_tablename, tablename

Stackoverflow 帖子中提供了更多建议

此外,Microsoft 有一些关于 tempdb 性能改进的指南


推荐阅读