2016-07-29 8 views
2

Ich wollte wissen, ob wir irgendeine Technik haben, mit der wir den Wert berechnen können, der für eine LIMIT-Klausel des Massensammelvorgangs gesetzt werden musste. Zum Beispiel, sagen wir, unser Cursor hat 10 Millionen Datensätze..Was ist der Wert, den wir für die LIMIT-Klausel setzen können, um optimale Leistung zu haben. Können wir es irgendwie berechnen?Einen Wert für LIMIT während der Verwendung von Massensammeln setzen

decalre 
cursor c_emp is <some select query> 

var <variable> ; 

begin 
    open c_emp; 
     loop 
      fetch c_emp bulk collect into var limit 2; 
      exit when c_emp%NOTFOUND; 
     end loop; 
    close c_emp; 
    end; 
+2

Die Größe der Zeile ist auch ein Faktor und die Menge des verfügbaren Sitzungsspeichers angesichts der Anzahl der Sitzungen, die wahrscheinlich gleichzeitig ausgeführt werden. Ich weiß nicht, welche anderen Faktoren notwendig wären, um ein vollständiges Bulk-Fetch-Optimierungsmodell zu erstellen, aber normalerweise erhalten Sie abnehmende Renditen über einige hundert Zeilen hinaus. –

+2

Wie bei allem, ist der beste Ansatz, Benchmarks in Ihrer Umgebung mit Ihren Daten zu vergleichen. Normalerweise wird etwas zwischen 100 und 1000 ziemlich optimal sein. Wenn Sie statt einer expliziten einen impliziten Cursor verwendet haben, würde Oracle automatisch 100 Zeilen gleichzeitig unter dem Deckblatt abholen. –

Antwort

4

Verwenden Sie einen impliziten Cursor in einem Cursor FOR LOOP. Es macht den Code einfacher und der Standardwert von 100 ist fast immer gut genug.

Ich habe eine Menge Leute gesehen, die viel Zeit damit verschwenden, sich darüber Gedanken zu machen. Wenn Sie an denken, warum Bulk Collect die Leistung verbessert, werden Sie verstehen, warum große Zahlen nicht helfen werden.

Bulk Collect verbessert die Leistung, indem die Kontextwechsel zwischen SQL und PL/SQL reduziert werden. Stellen Sie sich das höchst unwahrscheinliche Worst-Case-Szenario vor, bei dem die Kontextumschaltung die gesamte Laufzeit verbraucht. Ein Limit von 2 eliminiert 50% der Kontextwechsel; 10 eliminiert 90%; 100 eliminiert 99% usw. Plot es aus und Sie werden erkennen, dass es sich nicht lohnt Größe die optimale Grenze zu finden:

enter image description here

die Standardeinstellung verwenden. Verbringen Sie Ihre Zeit damit, sich um wichtigere Dinge zu sorgen.

+1

Nur um fair zu sein, könnte das OP wollen Massen sammeln, um Array-DML mit 'forall' oder etwas ähnliches durchzuführen, was eine Cursor-FOR-Schleife nicht helfen wird. Aber schöne Erklärung für die abnehmende Rendite. –

Verwandte Themen