Как я могу "вычесть" одну таблицу из другой? - PullRequest
6 голосов
/ 04 февраля 2009

У меня есть главная таблица A, ~ 9 миллионов строк. Другая таблица B (той же структуры) имеет ~ 28K строк из таблицы A. Каков наилучший способ удалить все содержимое B из таблицы A?

Комбинация всех столбцов (~ 10) уникальна. Ничего более в форме уникального ключа.

Ответы [ 6 ]

6 голосов
/ 05 февраля 2009

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

CREATE TABLE TEMP_A AS
SELECT *
FROM   A
MINUS
SELECT *
FROM   B

Это должно работать довольно хорошо.

3 голосов
/ 04 февраля 2009
DELETE FROM TableA WHERE ID IN(SELECT ID FROM TableB)

Должно работать. Хотя это может занять некоторое время.

2 голосов
/ 04 февраля 2009

в одну сторону, просто перечислите все столбцы

delete table a
where exists (select 1 from table b where b.Col1= a.Col1 
AND b.Col2= a.Col2 
AND b.Col3= a.Col3
AND b.Col4= a.Col4)
1 голос
/ 05 февраля 2009

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

Если это невозможно, второй вариант заключается в определении «селективности» каждого из столбцов (т. Е. Сколько «различных» значений имеет каждый столбец, «имя» будет более избирательным, чем «страна адреса») «чем« мужчина / женщина »). Общий тип заявления, который я бы предложил, был бы таким:

Delete from tableA
where exists (select * from tableB
 where tableA.colx1 = tableB.colx1
 and tableA.colx2 = tableB.colx2
 etc. and tableA.colx10 = tableB.colx10).

Идея состоит в том, чтобы перечислить столбцы в порядке избирательности и построить индекс для столбцов colx1, colx2 и т. Д. В таблицеB. Точное количество столбцов в таблице B будет результатом некоторых испытаний и измерений. (Смещение времени для построения индекса для таблицы B с улучшенным временем оператора удаления.)

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

1 голос
/ 04 февраля 2009
Delete t2 
from t1 
inner join t2 
  on t1.col1 = t2.col1
  and t1.col2 = t2.col2
  and t1.col3 = t2.col3
  and t1.col4 = t2.col4
  and t1.col5 = t2.col5
  and t1.col6 = t2.col6
  and t1.col7 = t2.col7
  and t1.col8 = t2.col8
  and t1.col9 = t2.col9
  and t1.col10 = t2.col0

Скорее всего, это будет очень медленно, так как вам нужно будет индексировать каждый столбец, что маловероятно в среде, где таблица такого размера не имеет первичного ключа, так что делайте это во время пика. Что побудило вас иметь таблицу с 9 миллионами записей и без первичного ключа?

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

Есть ли ключевое значение (или значения), которое можно использовать?

что-то вроде

DELETE a
FROM tableA a
INNER JOIN tableB b
on b.id = a.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...