Отвечая на ваши вопросы один за другим:
- Поскольку я запускаю одну команду удаления, вызывает рост базы данных tempdb?
Может быть. Поскольку вы выполняете огромную операцию DML, некоторые данные из буферного кэша перемещаются в базу данных tempdb для выполнения этой операции, и это вызывает рост базы данных tempdb.
Будет ли пространство, занимаемое в базе данных tempdb, автоматически очищаться при закрытии соединения?
Нет. tempdb не будет автоматически уменьшаться. Когда служба базы данных перезапускается, создается база данных tempd fre sh и восстанавливается ее первоначальный размер.
Есть ли способ избежать этой ситуации?
- Вы можете go для небольших партий для операции ОБНОВЛЕНИЯ.
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
- Попробуйте go для SELECT * INTO к другой таблице, а затем переименуйте вновь созданную таблицу в текущее имя таблицы
SELECT col1, updatedCol2
INTO new_tableName
FROM tablename;
sp_rename tablename, old_tablename
sp_rename new_tablename, tablename
В сообщении Stackoverflow
есть и другие предложения. Кроме того, у Microsoft есть некоторые рекомендации по улучшению производительности tempdb