2016-04-26 5 views
0

Wenn ich eine Abfrage mit SQL Developer ausführen und Bind-Variablen wie :type verwenden, werden aufgefordert, Werte zu verwenden, und dann die Abfragen schneller ausgeführt, als wenn ich die Bindung Variablen durch behoben Literalwert, sagen Sie 'A'.Abfragen läuft langsam ohne Parameter in SQL Developer

Zum Beispiel die erste Abfrage, die als die zweite Abfrage schneller läuft:

erste Abfrage (läuft 0,5 Sekunden)

select DMDUNIT, LOC, SUM(QTY) 
from hist 
where dmdunit = :lv_dmdunit and type = :lv_type and loc = :lv_loc 
and startdate >= sysdate - 40 
GROUP BY DMDUNIT,LOC 

zweite Abfrage (läuft 1,7 Sekunden)

select DMDUNIT, LOC, SUM(QTY) 
from hist 
where dmdunit = 'PROD_1' and type = 'A' and loc = 'B101' 
and startdate >= sysdate - 40 
GROUP BY DMDUNIT,LOC 

Warum Läuft die erste Abfrage schneller als die zweite Abfrage? Welche Schritte kann ich ausführen, um die zweite Abfrage so schnell wie die erste auszuführen?

Dies ist eine kleine Abfrage und 1 Sekunde macht keinen großen Unterschied, aber ich habe auch große Abfragen, wo der Unterschied zwischen den gleichen Abfragen (Params und Non-Params) 10 bis 15 Minuten sind.

+0

Was die Ausführungspläne für beide Abfragen zeigen? Welche Version der Oracle-Datenbank verwenden Sie? (Außerdem können Sie in SQL Developer Bindungswerte als Teil eines Skripts festlegen, indem Sie den Befehl 'variable' und einen anonymen Block verwenden, wenn Sie sie bei Aufforderung nicht weiter eingeben möchten) –

+0

Wahrscheinlich mit" Parameter Sniffing "zu tun "- Suche nach mehr. – Hogan

Antwort

1

Hier ist ein interessanter Test: Nur zum Spaß, ändern Sie die Namen Ihrer Bindevariablen (zum Beispiel, nennen sie: x,: y und: z) - oder, noch besser, ändern Sie einfach einen Buchstaben in einem der Variablen. Das erste Mal, wenn Sie die Abfrage ausführen, sollte sie etwa so lange dauern wie die zweite Abfrage, wenn alles andere gleich ist (was es nie ist).

Einer der Vorteile der Verwendung von Bindevariablen ist, dass die Abfrage nur einmal analysiert wird. Die Engine muss die Abfrage weiterhin ausführen, der zusätzliche Aufwand für die Interpretation der Abfrage, die Optimierung usw. wird jedoch vermieden. Die Fachbegriffe sind "Soft Parsing" vs. "Hard Parsing". Gute Lektüre zu diesem Thema:

https://blogs.oracle.com/sql/entry/improve_sql_query_performance_by