Подтвердить что ты не робот

Удаление записей SQL Server 2005 без ведения журнала

Как удалить записи из таблиц SQL Server 2005, не записывая их в журналы транзакций.

Я не хочу регистрироваться, потому что после удаления эти записи больше никогда не понадобятся.

В настоящее время различные удаления занимают слишком много времени. Существуют ли какие-либо другие варианты улучшения производительности операторов удаления? Я не могу использовать truncate, потому что есть предложение where.

4b9b3361

Ответ 1

Это легко:

DECLARE @BatchSize INT
SET @BatchSize = 100000

WHILE @BatchSize <> 0
BEGIN
    DELETE TOP (@BatchSize)
    FROM [dbo].[UnknownTable]
    SET @BatchSize = @@rowcount
END  

Ответ 2

Я думаю, вы путаете концепцию журнала транзакций в базе данных. Первичная функция журнала транзакций не предназначена для восстановления старых строк - это задание - поддерживать согласованность базы данных. Все изменения проходят через журнал транзакций, и нет никакого способа обойти это. Это хорошо. Журнал транзакций также используется для создания резервных копий времени и восстановления базы данных и используется при зеркалировании между двумя серверами.

Если у вас есть удаления, которые занимают слишком много времени, сначала вы должны посмотреть в нескольких областях.

1) У вас есть триггеры DELETE, которые стреляют из ваших таблиц? Если это так, это может стать источником медлительности.

2) Правильно ли ваш администратор базы данных правильно настроил базу данных, сохраняя журнал транзакций и файлы данных на отдельных физических дисках?

3) У вас есть много внешних ключей, которые проверяются? Например, если у вас есть другая таблица, которая ссылается на таблицу, которую вы удаляете, сервер базы данных проверяет каждое удаление по ссылочным таблицам, чтобы убедиться, что оператор delete не приводит к тому, что эти другие таблицы становятся несовместимыми.

4) У вас слишком много индексов или в противном случае высокий показатель индексации на удаляемой вами таблице? Каждая удаленная строка будет соответствовать записи в каждом удаляемом индексе, поэтому будьте осторожны в отношении использования индексов. Правильно ли поддерживаются ваши индексы?

5) Требуется ли длительное время искать строки, которые вы хотите удалить? Если предложение WHERE в вашем документе DELETE слишком дорогое, это действительно замедлит ваши удаления. Попробуйте временно изменить оператор DELETE на инструкцию SELECT и посмотреть, быстро ли этот запрос выполняется. Если это не так, вы должны оптимизировать инструкцию SELECT, отредактировав ее, реструктурируя свои таблицы или добавив соответствующие индексы. Затем измените утверждение на DELETE. Эффективность должна быть значительно улучшена, если ваше соответствующее выполнение оператора SELECT улучшилось во время вашей оптимизации.

Если у вас есть большое пакетное задание, выполняющее большое количество удалений по вашим таблицам, вы можете временно отключить триггеры или захотите сбросить и заново создать свои индексы и внешние ключи после этих больших партий удалений. Это также может ускорить процесс.

Ответ 3

Если вы удаляете всю таблицу, вы можете использовать TRUNCATE TABLE, которая регистрирует только освобождение страницы, а не запись для каждой удаленной строки. Я не знаю, как сделать удаление без каких-либо транзакций.

Ответ 4

Забудьте журнал транзакций как источник скорости или что-то другое, кроме того, что используется внутри БД, чтобы сохранить согласованность. Вместо этого вам следует подумать о том, чтобы найти способ сделать удаление пакетами. Вместо одной инструкции удаления, и если бы у вас было целочисленное значение PK в таблице, попробуйте удалить диапазоны значений и сделать это в цикле. Так что что-то вроде

Declare @RecordsLeft int
Declare @StartRange int
Declare @EndRange int
Declare @BatchSize int

Set @BatchSize = 10000
Set @RecordsLeft = ( Select Count(*) From ... )
Set @StartRange = 0
Set @EndRange = @StartRange + @BatchSize

While @RecordsLeft > 0
Begin
    Delete ...
    Where ...
      And PK Between @StartRange And @EndRange

    Set @RecordsLeft = ( Select Count(*) From ... )
    Set @StartRange = @EndRange + 1
    Set @EndRange = @StartRange + @BatchSize
End

Ответ 5

Просто попробуйте удалить записи, добавив эти инструкции до и после операторов delete. traceon(610) и traceoff(610). это похоже на

dbcc traceon(610)

--Your Delete Statement
delete statement


dbcc traceoff(610)

Ответ 6

Прежде всего, обратите внимание, что у вас не может быть журнала транзакций. Что делать, если вы теряете власть на сервере, делая огромное удаление? Эта информация необходима, чтобы SQL Server мог выполнять атомные операции.

Что может вас заинтересовать, но это "модель восстановления". Пожалуйста, прочитайте эту статью по технике: http://technet.microsoft.com/en-us/library/ms189275.aspx

Ответ 7

Вы удаляете материал, но у вас есть предложение where, поэтому применяются обычные рекомендации по производительности SQL.

Используете ли вы профилировщик SQL для просмотра плана выполнения запросов? Если вы записываете эти операции, вы можете использовать мастер выполнения для их анализа и, возможно, предложить новый индекс.

Если вы выполняете множество отдельных инструкций delete (delete... where id = xxx), вам может быть лучше создать временную таблицу со всеми идентификаторами и присоединиться к этой таблице temp, чтобы иметь один оператор удаления.