IN vs OR von Oracle, welche schneller?
Bin ich eine Anwendung entwickeln, welche Prozesse viele Daten in der Oracle-Datenbank.
In einigen Fällen habe ich zu viele Sache auf eine bestimmte Liste von Bedingungen, und ich benutze SELECT ...FROM.. WHERE... IN...
, aber die IN
Ausdruck akzeptiert nur eine Liste, deren Größe maximal 1.000 Artikel.
Also ich benutze OR
Ausdruck anstelle, aber wie ich beobachten kann-vielleicht ist diese Abfrage (mit OR
) ist langsamer als IN
(mit der gleichen Liste, Bedingung). Ist es richtig? Und wenn ja, wie die Verbesserung der Geschwindigkeit von Abfragen?
Kommentar zu dem Problem - Öffnen
Ist die Liste statischen oder aus einer Abfrage?
Nein, die Liste mit Wert-Abfrage abgerufen aus externen Quellen. Gibt es eine Möglichkeit, dieses Problem zu lösen, da meine Liste ist zu groß, enthalten über 100000 Artikel
So, du bist die Schaffung eines massiven query-string, wie IN (...9997, 9998, 9999, 1000,1001 ...) ? Das allein wird eine Menge Kosten, zu übermitteln und zu analysieren. Achten Sie nicht auf die sql-injection-Möglichkeiten.
InformationsquelleAutor der Frage | 2011-06-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
IN
vorzuziehen istOR
--OR
ist eine notorisch schlechte Darsteller, und kann dazu führen, andere Probleme, die müsste mit der Klammer in komplexen Abfragen.Bessere option als entweder
IN
oderOR
, ist die Verknüpfung zu einer Tabelle mit den Werten, die Sie wollen (oder nicht wollen). Diese Tabelle für den Vergleich abgeleitet werden können, temporäre oder bereits bestehende in Ihrem schema.InformationsquelleAutor der Antwort OMG Ponies
In diesem Szenario würde ich dies tun:
Bedeutet dies, dass Sie können lassen Sie die Art der Datenbank und schreiben Sie eine einfache Abfrage.
InformationsquelleAutor der Antwort WW.
Ich würde Fragen, der ganze Ansatz. Die Kunde von der SP hat zu senden, 100000-IDs. Wo kommt der AUFTRAGGEBER dieser IDs aus? Das versenden einer so großen Anzahl von ID als parameter der proc-Kosten wird deutlich sowieso.
InformationsquelleAutor der Antwort oazabir
Oracle intern konvertiert IN Listen zu Listen von ORs eh also da sollte es wirklich keine performance-Unterschiede. Der einzige Unterschied ist, dass Oracle zu transformieren INs hat aber mehr strings zu Parsen, wenn Sie die Versorgung der Gebiete in äußerster Randlage selbst.
Hier ist, wie Sie das testen.
InformationsquelleAutor der Antwort jva
Wenn Sie die Tabelle mit einem primary key:
gehen und durch das gleiche Wählt, die zum ausführen der Abfrage mit mehreren Werten, gefolgt von dem abrufen der Ausführungsplan per hash-Wert, was Sie bekommen, ist:
Dies scheint zu implizieren, dass, wenn Sie haben eine Liste und diese mit einem PK-Spalte, Oracle hält die Liste intern als "INLIST", da es effizienter zu verarbeiten, anstatt Sie zu konvertieren ORs, wie in der Fall von eine nicht indizierte Tabelle.
War ich mit Oracle 10gR2 oben.
InformationsquelleAutor der Antwort TrevorH