【问题标题】:Tempdb growing while deleting millions of recordsTempdb 在删除数百万条记录时增长
【发布时间】:2020-07-11 13:49:41
【问题描述】:

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

我的问题是:

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

【问题讨论】:

  • 您使用的是哪个数据库?一旦你使COMMIT 临时数据应该被删除。
  • 避免的一种方法是在新表中插入要保留的行,截断当前表并重新插入到原始表中。
  • SQL 服务器 2014
  • 感谢您的所有回复,他们真的很有帮助。我看起来我发现了问题。数据库设置为 READ COMMITTED SNAPSHOT ISOLATION ,这导致 tempdb 保存要修改的数据副本。所以我用 where 条件将单个命令拆分为多个,

标签: sql sql-server sql-server-2014


【解决方案1】:

一一回答你的问题:

  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 post有更多建议

另外,微软有some guidelines on tempdb performance improvement

【讨论】:

    【解决方案2】:

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

    当您删除记录时,它会记录到事务日志中。所以通过删除这么多记录,事务日志的大小会增加。

    所以我认为你必须清除/重置事务日志(谷歌它),同时你要重新组织索引。

    这两个步骤都是强制性的。

    在 tempdb 中消耗的空间是否会在运行时自动清除? 连接已关闭?

    没有

    有什么办法可以避免这种情况?

    你要删除部分表,超过 80% 吗?

    Suggested Reading 1

    Suggested Reading 2

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-07
      • 2023-03-11
      • 2021-11-20
      • 2021-03-15
      相关资源
      最近更新 更多