Удаление нескольких строк из таблицы в SQL Server - PullRequest
6 голосов
/ 26 января 2009

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

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

РЕДАКТИРОВАНИЕ из комментария к ответу ниже.

"Я запускаю тот же запрос, т. Е. Удаляю из table_name с помощью условия Where ... Можно ли отключить индексирование при запущенном Query, потому что Query выполняется с последних 20 часов? .. "

Ответы [ 10 ]

5 голосов
/ 26 января 2009

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

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

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

3 голосов
/ 26 января 2009

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

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

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

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

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

2 голосов
/ 26 января 2009

Возможно, вы захотите попробовать удалить также и в пакетном режиме. Я только что проверил это на имеющейся у меня таблице, и операция удаления изменилась с 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
1 голос
/ 26 января 2009

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

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

1 голос
/ 26 января 2009
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.

0 голосов
/ 26 января 2009
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;
0 голосов
/ 26 января 2009

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

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

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

0 голосов
/ 26 января 2009

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

0 голосов
/ 26 января 2009

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

truncate table <table>

Не уверен, является ли это стандартным SQL или доступно в SQL Server. Однако он очистит всю таблицу - но тогда он будет быстрее, чем "удалить из" (он также выполнит коммит).

0 голосов
/ 26 января 2009

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

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

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