sql - Tempdb 在删除数百万条记录时增长
问题描述
我必须运行一个删除命令,删除近 400 万条记录。删除时注意到 tempdb 数据文件的增长与表大小一样多,并且会填满驱动器。
我的问题是:
- 由于我正在运行单个删除命令导致 tempdb 增长?
- 连接关闭时,tempdb中消耗的空间会自动清除吗?
- 我们有什么办法可以避免这种情况?
解决方案
一一回答你的问题:
- 由于我正在运行单个删除命令导致 tempdb 增长?
可能。当您正在运行一个巨大的 DML 操作时,缓冲区缓存中的一些数据被移动到 tempdb 以执行该操作,这导致了 tempdb 的增长。
- 连接关闭时,tempdb中消耗的空间会自动清除吗?
不,tempdb 不会自动收缩。重新启动数据库服务时,会重新创建 tempdb 并将重置为其原始大小。
我们有什么办法可以避免这种情况?
- 您可以进行小批量的 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 性能改进的指南
推荐阅读
- java - 创建事件时返回“java.lang.ClassCastException”
- parallel-processing - Hangfire:我们可以并行运行多个队列吗?
- ios - [MCAdvertiserAssistant 广告商:didNotStartAdvertisingPeer:]:发送到实例的无法识别的选择器
- updating - 更新到 angulr 9 到 10 我得到了这个问题
- javascript - 我可以在不使用 .push 的情况下在 google Datalayer 对象上设置属性吗?
- unity3d - 无法将 Visual Studio for Mac 调试器附加到 Unity 2020
- snowflake-cloud-data-platform - 当前行值为 NULL 时,Snowflake 的 LAG 函数错误
- github - 无法打开 Insights -> Contributors,总是加载
- python - Python + OpenCV + Base64:将帧转换为 base64 的问题
- c++ - 由于来自 QtRemoteObjects 副本定义的未解析符号导致链接器错误