2016-07-11 20 views
1

Ich versuche, einige Daten aus einer Tabelle zu finden, die nicht in einer anderen Tabelle ist.Optimieren einer linken Verknüpfung

Ich habe versucht, verschiedene Lösungen zu verwenden, aber mein Problem ist immer die Leistung (Tabelle_a hat ~ 100 000 Zeilen und Tabelle_b hat ~ 5,8 Millionen Zeilen).

Gibt es eine schnelle (er) und/oder (mehr) effektive Möglichkeit, das zu tun?

Vielen Dank im Voraus ...

SELECT 
    * 
FROM 
    table_a a 
LEFT JOIN 
    table_b b ON b.field_one = a.field_one 
WHERE 1 
    AND b.id IS NULL 
+0

Sie könnten Indizes für die beiden Tabellen einrichten, dies würde die Leistung des Joins unterstützen. Hast du das gemacht? –

+1

Zeigen Sie Ihre 'create table' Anweisungen für beide Tabellen bitte – Alex

+1

Verwenden Sie nie Select *. In diesem Fall fügen Sie viele unnötige Spalten hinzu, da Sie in Tabelle b keine Daten haben, die Spalten jedoch zurückgeben. Das verbraucht Ressourcen. SELECT * ist ein SQL-Antipattern und sollte nicht im Produktionscode erscheinen. – HLGEM

Antwort

2

Sie können versuchen, die NOT EXISTS() Version dieser Verwendung, die eine effizientere (nicht unbedingt) sein kann:

SELECT * FROM Table_a a 
WHERE NOT EXISTS(SELECT 1 FROM Table_b b 
       WHERE a.field_old = b.field_one) 

Sie auch in Betracht ziehen sollten das Hinzufügen (wenn Sie sie noch nicht haben) Indizes für die Tabellen:

Unles s diese Tabellen sind wirklich breit (viele Spalten), mit dieser Menge an Daten mit den richtigen Indizes sollte es nicht so lange dauern.

Verwandte Themen