Я продолжу и опубликую это как ответ - вам нужно использовать здесь синтаксис LEFT/RIGHT JOIN
. СУБД будет логически интерпретировать ваш существующий SQL, чтобы неявно означать INNER
объединений.
Кроме того, вам, возможно, придется пересмотреть ваши GROUP BY
пункты.
Возможно, вам потребуется использовать подзапросов - сначала выберите интересующие строки, а затем суммируйте их.
Если Вы имеете достаточные права, можно составить новую таблицу и переименовать ту одну к A. Для составления новой таблицы, можно использовать следующий сценарий:
CREATE TABLE TEMP_A AS
SELECT *
FROM A
MINUS
SELECT *
FROM B
Это должно работать довольно хороший.
DELETE FROM TableA WHERE ID IN(SELECT ID FROM TableB)
Должен работать. Мог бы требовать времени все же.
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 миллионами записей и никаким первичным ключом?
один путь, просто перечислите все столбцы
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)
Существует ли значение ключа (или значения), который может использоваться?
что-то как
DELETE a
FROM tableA a
INNER JOIN tableB b
on b.id = a.id
Если это - что-то, что необходимо будет сделать регулярно, предпочтительный вариант должен состоять в том, чтобы попытаться улучшить проектирование баз данных (ищущий первичные ключи, пытаясь получить условие "соединения" идти как можно меньше столбцов).
Если это не возможно, отличная вторая опция состоит в том, чтобы выяснить "селективность" каждого из столбцов (т.е. сколько "различных" значений делает каждый столбец, имеют, 'имя' было бы более выборочным, чем 'страна адреса', чем 'штекер/розетка'). Общий тип оператора, который я предложил бы, будет похож на это:
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 и т.д. на tableB. Точное число столбцов в tableB было бы результатом некоторого trial&measure. (Сместите время для создания индекса на tableB с улучшенным временем оператора удаления.)
Если бы это - просто одна операция времени, я просто выбрал бы один из медленных методов, обрисованных в общих чертах выше. Это, вероятно, не стоит усилия думать слишком много об этом, когда можно только запустить оператор перед хождением домой...