2016-04-15 4 views
0

Bitte schlagen Sie vor, welche der folgenden Abfrage für große Datenmenge schneller sein wird. Eigentlich muss ich nicht passende Datensätze zwischen temp und COSTING_TABLE finden und der Datensatz ist in Millionen. Wir müssen noch Indizes implementieren, aber ich suche nach einer effizienten Methode, um das Gleiche zu tun., die eine JOIN- oder IN-Klausel besser ausführen

SELECT tmp.PRINT, tmp.NAME, tmp.COST , tmp.CURRENCY, tmp.validity 
            FROM TEMPTABLE tmp 
            WHERE NOT EXISTS (SELECT 1 
                 FROM COSTING_TABLE ct 
                 WHERE (ct.print = tmp.print 
                 AND ct.name IN (SELECT name FROM CostMapping WHERE PRICE 'ABC') 
                 AND ct.COST <> tmp.COST 
                 AND to_date(tmp.validity,'DD-MON-YY') > SYSDATE) 
                ) 
            AND tmp.name = 'ABC'; 

enter image description here

JOIN mit

SELECT tmp.PRINT, tmp.NAME, tmp.COST , tmp.CURRENCY, tmp.validity 
FROM TEMPTABLE tmp 
LEFT OUTER JOIN 
COSTING_TABLE ct 
ON ct.print = tmp.print AND 
ct.name IN (SELECT name FROM CostMapping WHERE PRICE = 'ABC') 
    AND ct.COST <> tmp.COST 
    AND to_date(tmp.valid_before,'DD-MON-YY') > SYSDATE 
WHERE tmp.name = 'ABC' AND 
(ct.PRINT IS NULL OR ct.NAME IS NULL OR ct.COST IS NULL OR ct.validity IS NULL); 

enter image description here

Vielen Dank im Voraus.

+0

Auf den ersten Blick sehen mir die beiden Abfragen nicht besonders ähnlich - verschiedene Spalten, unterschiedliche Tabellenzahlen werden referenziert. –

Antwort

1

Wenn Sie beabsichtigen, INDEXES für Ihre Spalte zu erstellen, entspricht die Verwendung der IN-Klausel der Verwendung der JOIN-Klausel. Aber normalerweise bevorzuge ich ANSI-konforme JOINS.

Sie können auch diese verweisen article:

IN Prädikat ist ein hässliches Entlein von SQL. Aufgrund der Tatsache, dass es ineffizient im Auge eines unerfahrenen Entwicklers erscheint, ist es in der Regel als nicht effizient und EXISTS oder ein JOIN werden empfohlen, stattdessen zu verwenden.

Allerdings optimiert Oracle IN ziemlich gut, mit Indizes, UNIQUE Einschränkungen, NOT NULL Modifikatoren und andere zusätzliche Informationen mit Bedacht.

Verwandte Themen