Tempdb растет при удалении миллионов записей - PullRequest
0 голосов
/ 31 марта 2020

Мне пришлось запустить команду удаления, которая удаляет почти 4 миллиона записей. При удалении отмечается, что файл данных tempdb увеличивается по размеру таблицы и собирается заполнить диск.

Мои вопросы:

  1. Поскольку я запускаю один команда удаления вызывает рост tempdb?
  2. Будет ли пространство, занимаемое в базе данных tempdb, автоматически очищаться при закрытии соединения?
  3. Есть ли способ избежать этой ситуации?

Ответы [ 2 ]

0 голосов
/ 31 марта 2020

Так как я запускаю одну команду удаления, вызывает рост базы данных tempdb?

при удалении записей он записывается в журнал транзакций. поэтому, удаляя так много записей, размер журнала транзакций увеличивается.

Так что я думаю, что вам нужно очистить / сбросить журнал транзакций (Google it), и в то же время вы реорганизуете индексы.

Оба шаги являются обязательными.

Будет ли пространство, занимаемое в базе данных tempdb, автоматически очищаться при закрытии соединения?

NO

Есть ли Как мы можем избежать этой ситуации?

Вы удаляете часть таблицы, более 80%?

Рекомендуемое чтение 1

Рекомендуемое чтение 2

0 голосов
/ 31 марта 2020

Отвечая на ваши вопросы один за другим:

  1. Поскольку я запускаю одну команду удаления, вызывает рост базы данных 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...