Использование SQL Server 2005.
Я выполняю огромное DELETE FROM без предложений where. Это в основном эквивалентно выражению TRUNCATE TABLE - за исключением того, что я не могу использовать TRUNCATE. Проблема в том, что таблица огромна - 10 миллионов строк, и заполнение занимает более часа. Есть ли способ сделать это быстрее без:
- Использование усечения
- Отключение или удаление индексов?
Т-журнал уже находится на отдельном диске.
Любые предложения приветствуются!
sql-server
performance
delete
tuseau
источник
источник
Ответы:
Что вы можете сделать, так это групповое удаление:
Где ххх, скажем, 50000
Модификация этого, если вы хотите удалить очень высокий процент строк ...
источник
Вы можете использовать предложение TOP, чтобы сделать это легко:
источник
Я согласен с предложениями по пакетному удалению в управляемые куски, если вы не можете использовать TRUNCATE, и мне нравится предложение удалить / создать из-за его оригинальности, но мне любопытен следующий комментарий в вашем вопросе:
Я предполагаю, что причина этого ограничения связана с безопасностью, которая должна быть предоставлена для прямого усечения таблицы, и тем фактом, что это позволит вам усекать таблицы, отличные от той, которая вас интересует.
Предполагая, что это так, мне интересно, будет ли созданная хранимая процедура, использующая TRUNCATE TABLE и использующая «EXECUTE AS», приемлемой альтернативой предоставлению прав безопасности, необходимых для прямого усечения таблицы.
Надеемся, что это даст вам необходимую скорость, а также решит проблемы безопасности, которые могут возникнуть в вашей компании при добавлении вашей учетной записи в роль db_ddladmin.
Другое преимущество использования хранимой процедуры таким образом состоит в том, что сама хранимая процедура может быть заблокирована, так что только определенным учетным записям разрешено использовать ее.
Если по какой-то причине это неприемлемое решение и вам необходимо удалить данные из этой таблицы, то это нужно делать один раз в день / час / и т. Д., Я бы попросил создать задание агента SQL для усечения таблицы. в запланированное время каждый день.
Надеюсь это поможет!
источник
Кроме усечения .. только удаление в пакетах может помочь вам.
Вы можете удалить таблицу и воссоздать ее со всеми ограничениями и индексами. В Management Studio у вас есть возможность сценария удаления и создания таблицы, поэтому это должен быть тривиальный вариант. Но это только в том случае, если вам разрешено выполнять действия DDL, что, на мой взгляд, на самом деле не вариант.
источник
Поскольку этот вопрос является настолько важной ссылкой, я публикую этот код, который действительно помог мне понять удаление с помощью циклов, а также обмен сообщениями внутри цикла для отслеживания прогресса.
Запрос изменен из этого дублирующего вопроса. Кредит @RLF для базы запросов.
источник