Intereting Posts
В чем разница между уникальным ключом и индексом с IsUnique = Yes? Заполнить последовательность в строках sql В какой мощности SQL Server переключается на сканирование индекса (против поиска) Как указать экземпляры SQL Server, установленные на локальном компьютере? (Только местные) Множественные индексы и индексы с несколькими колонками EntityFramework 6.1.1 с проблемой производительности Linq Почему сервер sql хранит символы вопросительного знака вместо японских символов в полях NVarchar? Разделительная строка T-SQL на основе разделителя SQL Azure импортирует медленный, зависает, но локальный импорт занимает 3 минуты Удаление базы данных из C # Динамические параметры хранимой процедуры Проблема с SQL Server "EXECUTE AS" Уровень данных соединения – как редактировать таблицы SQL Alter: добавить несколько FK? Как получить XML-безопасную версию XML-столбца sql-сервера

Удаление нескольких строк из таблицы в SQL Server

Как я могу удалить 1.5 миллиона строк из SQL Server 2000 и сколько времени потребуется для выполнения этой задачи.

Я не хочу удалить все записи из таблицы …. Я просто хочу удалить все записи, которые заполняют условие WHERE.

EDITED из комментария к ответу ниже.

«Я запускаю тот же запрос, т. Е. Удаляю из table_name с предложением Where … Возможно ли отключить индексирование в текущем запросе, потому что запрос выполняется с 20-го часа .. Также помогите мне, как я могу отключить индексирование ..»

Solutions Collecting From Web of "Удаление нескольких строк из таблицы в SQL Server"

Если (и только если) вы хотите удалить все записи в таблице, вы можете использовать DROP TABLE или TRUNCATE TABLE.

DELETE удаляет одну запись за раз и записывает запись в журнал транзакций для каждой удаленной строки. TRUNCATE TABLE намного быстрее, потому что он не записывает активность в журнале транзакций. Он удаляет все строки из таблицы, но структура таблицы и ее столбцы, ограничения, индексы и т. Д. Остаются. DROP TABLE удалит их.

Соблюдайте осторожность, если вы решите TRUNCATE. Это необратимо (если у вас нет резервной копии).

создайте вторую таблицу, вставив все строки из первого, которые вы не хотите удалить.

удалить первую таблицу

переименуйте вторую таблицу, чтобы она была первой

(или вариант выше)

Это часто бывает быстрее, чем удаление выбранных записей из большой таблицы.

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

While Exists(Select * From YourTable Where YourCondition = True) Delete Top (100000) From YourTable Where YourCondition = True 

Я не думаю, что вы можете использовать предикат TOP, если вы используете SQL2000, но он работает с SQL2005 и выше. Если вы используете SQL2000, вместо этого вы можете использовать этот синтаксис:

 Set RowCount 100000 While Exists(Select * From YourTable Where YourCondition = True) Delete From YourTable Where YourCondition = True 
 DELETE FROM table WHERE a=b; 

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

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

 --Disable Index ALTER INDEX [IX_MyIndex] ON MyTable.MyColumn DISABLE --Enable Index ALTER INDEX [IX_MyIndex] ON MyTable.MyColumn REBUILD 

Если вы хотите удалить все записи в таблице, вы можете использовать TRUNCATE.

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

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

Удалить из таблицы, где условие для этих 1.5 миллионов строк

Время зависит.

В Oracle также можно использовать

 truncate table <table> 

Не уверен, что это стандартный SQL или доступен в SQL Server. Тем не менее, она очистит всю таблицу, но затем она быстрее, чем «удалить из» (она также проведет фиксацию).

TRUNCATE также игнорирует любую ссылочную целостность или триггеры в таблице. УДАЛИТЬ ОТ … ГДЕ будет уважать и то, и другое. Время будет зависеть от индексации столбцов состояния, вашего оборудования и дополнительной загрузки системы.

Удалить SQL точно так же, как обычный SQL-удаление

удалить из таблицы, где [ваше состояние]

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

 CREATE TABLE new_table as select <data you want to keep> from old_table; index new_table grant on new table add constraints on new_table etc on new_table drop table old_table rename new_table to old_table;