SQL Server 2005 эффективное удаление - PullRequest
0 голосов
/ 04 января 2010

Моя проблема в том, что мне нужно удалить около 60 миллионов записей из таблицы, не вызывая взаимоблокировок с другими процессами, которые используют эту таблицу. На данный момент я почти закончил удаление записей, используя цикл while, который обрабатывает только около 1 млн. Записей за раз, однако это заняло весь день.

В1. Каков оптимальный способ удаления больших объемов данных из таблицы, при котором таблица остается в оперативном режиме и минимально влияет на другие ресурсы, которые должны использовать эту таблицу в MS SQL Server 2005?

В2. Есть ли способ реализовать блокировку отдельных строк (а не блокировку таблиц) в SQL Server, как в Oracle? (Примечание, отвечая на это, может ответить на вопрос Q1).

A2: Как @Remus Rusanu сообщил мне, что есть способ блокировка уровня строки с удалением.

Ответы [ 3 ]

2 голосов
/ 05 января 2010

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

1 голос
/ 05 января 2010

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

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

Что касается Q2, то в SQL Server была блокировка на уровне строк с середины 90-х, я не знаю, о чем вы на самом деле спрашиваете.

1 голос
/ 05 января 2010

Я недавно сделал что-то подобное. Я просто создал задание SQL Server, которое запускалось каждые 10 минут, удаляя миллион строк. Код следует

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
DELETE TOP 1000000 FROM BIG_TABLE WHERE CreatedDate <= '20080630'

У указанной таблицы было около 900 мил строк для начала. Не заметил каких-либо существенных проблем с производительностью.

...