2009-02-04 9 views
6

Ich habe eine Master-Tabelle A, mit ~ 9 Millionen Zeilen. Eine andere Tabelle B (gleiche Struktur) hat ~ 28K Reihen von Tabelle A. Was wäre der beste Weg, um alle Inhalte von B aus Tabelle A zu entfernen?Wie kann ich eine Tabelle von einer anderen "subtrahieren"?

Die Kombination aller Spalten (~ 10) ist einzigartig. Nichts mehr in Form eines einzigartigen Schlüssels.

Antwort

6

Wenn Sie genügend Rechte haben, können Sie eine neue Tabelle erstellen und diese in A umbenennen neue Tabelle können Sie das folgende Skript verwenden:

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

Dies sollte ziemlich gut funktionieren.

3
DELETE FROM TableA WHERE ID IN(SELECT ID FROM TableB) 

Sollte funktionieren. Könnte eine Weile dauern.

+1

mit einem Join im Löschen wird wahrscheinlich schneller sein – HLGEM

+1

Meine Lösung ist eine Entwicklerlösung. Keine fancypants DBA Lösung. :-D Aber ich lerne gerne mehr sql. –

+0

keine ID-Spalte in beiden Tabellen ... – Thorsten

2

eine Möglichkeit, die Liste nur die Spalten

alle aus
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) 
+0

+1 für "one way", nicht für Ihren tatsächlichen Code ... – gbn

+0

IMHO ist es immer ein gegeben, dass es ein Weg ist. Es gibt immer mehr als 17 Wege zu allem. –

+0

AFAIK gibt es nur eine Möglichkeit, eine Tabelle abzuschneiden (mit anderen Worten eine minimal geloggte Löschoperation) – SQLMenace

0

Gibt es einen Schlüsselwert (oder Werte), die verwendet werden können?

so etwas wie

DELETE a 
FROM tableA a 
INNER JOIN tableB b 
on b.id = a.id 
+0

pls siehe aktualisiert qn – Bajji

1
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 

Dies ist wahrscheinlich sehr langsam sein, wie Sie indiziert haben müßten alle col, welche in einer Umgebung sehr unwahrscheinlich ist, wenn eine Tabelle dieser Größe keinen Primärschlüssel hat, so Mach es während der Nacht. Was besaß Sie, um einen Tisch mit 9 Millionen Datensätzen und keinen Primärschlüssel zu haben?

+0

+1 für die Angabe, es wird langsam sein ... – Thorsten

1

Wenn Sie dies regelmäßig tun müssen, sollten Sie zunächst versuchen, das Datenbankdesign zu verbessern (indem Sie nach Primärschlüsseln suchen und versuchen, die "Join" -Bedingung zu erhalten) Spalten wie möglich). Wenn das nicht möglich ist, besteht die eindeutige zweite Option darin, die "Selektivität" jeder der Spalten herauszufinden (dh wie viele "unterschiedliche" Werte jede Spalte hat, "Name" wäre selektiver als "Adresse") Land "als" männlich/weiblich "). Die allgemeine Art der Aussage würde ich vorschlagen, würde so aussehen:

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

Die Idee ist, die Spalten in der Reihenfolge der Selektivität aufzulisten und einen Index für colx1, colx2 usw. auf tableB zu bauen. Die genaue Anzahl der Spalten in Tabelle B wäre ein Ergebnis eines Versuchs &. (Versetzen Sie die Zeit zum Erstellen des Index für Tabelle B mit der verbesserten Zeit der Löschanweisung.)

Wenn dies nur eine einmalige Operation ist, wähle ich nur eine der oben beschriebenen langsamen Methoden. Es ist wahrscheinlich nicht die Mühe wert, zu viel darüber nachzudenken, wenn Sie einfach eine Aussage vor der Heimreise starten können ...

+0

+1 für die ersten und letzten Absätze. – karlgrz

Verwandte Themen