У меня есть две таблицы в двух базах данных.Один находится в «первичной» базе данных, второй - в «архивной» базе данных.Структуры идентичны, только данные разные.Проблема в том, что в основной таблице есть записи, которые дублируются в архивной таблице.Мне нужно удалить дубликаты из первичной таблицы перед архивированием записей в архивную таблицу.Первая попытка, казалось, работала хорошо, но журнал активности заполнился, убивая процесс, потому что там просто слишком много происходило.Администраторы баз данных сказали мне, чтобы удалить кусками по 100000.
Я также обнаружил, что в записях могут быть различия, даже если первичные ключи совпадают между базами данных.Эти записи должны быть сохранены, а не удалены как дубликаты.Это привело меня к пунктам INTERSECT и EXCEPT.Я пробовал эти три примера, и хотя каждый INTERSECT возвращает 100 000 записей, команда DELETE удаляет только от 94 000 до 95 000 записей.Я включил несколько комментариев для каждого.Последний удаляет все из основной таблицы базы данных.
-- Test #1: Doesn't delete 100,000 - around 94,000 or 95,000
DELETE TOP (100000) FROM [db_1].[table_1]
WHERE EXISTS (
-- Returns 100,000
SELECT * FROM [db_1].[table_1]
INTERSECT
SELECT * FROM [db_2].[table_1]
)
-- Test #2: Doesn't delete 100,000 - around 94,000 or 95,000
-- [test_data] returns 100,000 records
;WITH [test_data] AS (
-- Returns 100,000
SELECT TOP (100000) *
FROM (
SELECT * FROM [db_1].[table_1]
INTERSECT
SELECT * FROM [db_2].[table_1]
) [meh]
)
DELETE TOP (100000) FROM [db_1].[table_1]
WHERE EXISTS (
SELECT * FROM [test_data]
)
-- Test #3: Deletes everything from [db_1].[table_1]
-- The EXISTS clause returns 100,000
-- The DELETE statement deletes everything from [db_1].[table_1]
DELETE FROM [db_1].[table_1]
WHERE EXISTS (
SELECT TOP (100000) [meh].[address_rid]
,[meh].[REV]
FROM (
-- Returns 100,000
SELECT * FROM [db_1].[table_1]
INTERSECT
SELECT * FROM [db_2].[table_1]
) [meh]
)
Достаточно ли этой информации или мне нужно добавить больше?Заранее спасибо ...
* РЕДАКТИРОВАТЬ * Дерьмо! Хорошо, я ценю отзывы и постараюсь быть более тщательным в моем объяснении.Мне нужно удалить записи, которые дублируются между двумя таблицами базы данных.С требованием проверить каждую запись, чтобы удостовериться, что она является истинной копией, никакие данные не были изменены в основной базе данных, я обнаружил INTERSECT.Я понимаю, что он выполняет сравнение между полями, проверяя, является ли запись истинным дубликатом между таблицами базы данных.Как только это будет установлено, я хочу удалить дублированную запись из базы данных primary , оставив другую запись в базе данных archive ...
Primary database: Archive database:
table_1: table_1:
PK f_1 f_2 f_3 PK f_1 f_2 f_3
1 A B B 1 A B B
2 B D X 2 B D X
3 C G Y 13 Q M O
4 D J Z 14 S M K
В приведенных выше наборах таблиц дублирование выполняется с записями 1 и 2. Поскольку они обе существуют в обеих таблицах, мне нужно удалить их из основной таблицы базы данных.Я сталкиваюсь с тем, что в некоторых таблицах есть миллионы записей, и их необходимо удалить в 100 000 блоков записей, как это делают наши администраторы баз данных.Я думал, что если я добавлю INTERSECT в предложение EXISTS, ограничив результаты INTERSECT 100 000 записями, DELETE удалит этот 100 000 записей.Но это не так.Он удаляет, возможно, от 94 000 до 95 000 записей, затем, когда он приближается к концу удаления, он начинает удалять несколько тысяч за раз, сводя к концу несколько записей.
Если я использую его неправильно или если есть лучший способ удалить дублированные записи, я весь слух.Как отмечали некоторые из вас, мне трудно задавать вопросы правильно, поэтому я больше не задаю слишком много.Я ценю любые предложения, комментарии, советы и / или критику.Я не так горжусь, чтобы отказаться от любой помощи.Если это не словесная атака на мою собаку.Тогда я могу расстроиться!;-) Надеюсь, это поможет.Если нет, я уверен, что услышу об этом.