Удалите записи SQL Server 2005 без входа

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

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

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

16
задан Nick Kavadias 6 March 2010 в 14:12
поделиться

5 ответов

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

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

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

0
ответ дан 30 November 2019 в 17:04
поделиться

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

4
ответ дан 30 November 2019 в 17:04
поделиться

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

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

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

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

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

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

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

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

7
ответ дан 30 November 2019 в 17:04
поделиться

Забудьте о транзакции log в качестве источника скорости или чего-либо другого, кроме того, что используется внутри БД для обеспечения согласованности. Вместо этого вам следует подумать о том, чтобы найти способ выполнять удаление партиями. Вместо одного оператора удаления, и если у вас есть целочисленный 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
4
ответ дан 30 November 2019 в 17:04
поделиться

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

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

1
ответ дан 30 November 2019 в 17:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: