Массовое УДАЛЕНИЕ в SQL Server 2008 (есть ли что-то вроде Массового копирования (bcp) для удаления данных?) - PullRequest
14 голосов
/ 24 января 2010

Есть ли какое-либо решение для массового удаления в SQL Server?

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

Есть ли что-то вроде BulkКопировать (bcp) для удаления данных?

Ответы [ 6 ]

25 голосов
/ 24 января 2010

номер

Вы хотите УДАЛИТЬ с предложением WHERE: это стандартный SQL.

Что вы можете сделать, так это групповое удаление:

SELECT 'Starting' --sets @@ROWCOUNT
WHILE @@ROWCOUNT <> 0
    DELETE TOP (xxx) MyTable WHERE ...

Или, если вы хотите удалить очень высокий процент строк ...

SELECT col1, col2, ... INTO #Holdingtable
           FROM MyTable WHERE ..opposite condition..
TRUNCATE TABLE MyTable
INSERT MyTable (col1, col2, ...)
           SELECT col1, col2, ... FROM #Holdingtable
4 голосов
/ 04 февраля 2010

Вы можете сделать несколько вещей, если хотите удалить часть таблицы, а не TRUNCATE это.

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

SELECT *
INTO tmp_MyTable
FROM MyTable
WHERE Key='Value'

IF @@ROWCOUNT > 0
BEGIN
    EXEC sp_rename MyTable, old_MyTable, NULL
    EXEC sp_rename tmp_MyTable, MyTable, NULL
    TRUNCATE old_MyTable 
END

Во-вторых, если вы используете Partitioning, вы можете создать идентичную (пустую) таблицу на той же схеме секционирования ... и если таблица секционируется в соответствии с вашей логикой архивирования / очистки, вы можете переместить один блок секционирования из вашего основной таблицы до новой таблицы, а затем обрезать новую таблицу. Например:

ALTER TABLE MyTable
SWITCH PARTITION 15 TO purge_MyTable PARTITION 2 
GO; 

TRUNCATE TABLE purge_MyTable 

Ps. Разделы доступны в SQL 2005/08 Ent.

Надеюсь, это поможет!

0 голосов
/ 21 февраля 2014
0 голосов
/ 04 июня 2013

При обработке миллионов строк я предпочитаю использовать оператор WHERE и использовать SELECT INTO таблицу копирования, удалить исходную таблицу и переименовать копию (обратно в исходное имя).

Хотя вы должны иметь в виду такие вещи, как (FK) ключи, ограничения и т. Д. Но, используя этот метод, вы избегаете badazz-size журнала и не тратите огромное время на удаление фрагментов.

/ Snedker

0 голосов
/ 14 апреля 2013

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

Поскольку на соответствующую таблицу ссылаются только в одном месте, мы просто заменили эту ссылку на запрос имени динамической таблицы, который создается с помощью «select into», аналогичного тому, что предложил gbn.

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

0 голосов
/ 04 февраля 2010

Сычаре Едко,

Преимущество TRUNCATE состоит в том, чтобы избежать регистрации каждого отдельного удаления в файле журнала. оператор TRUNCATE создаст одну запись (в журнале) для всего пакета.

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