Zweitens kann ich die Reihenfolge erreichen, wenn ich die Reihenfolge ändern NOCACHE unabhängig von ORDER/NOORDER zu sein.
ja als NOCACHE effektiv zu bestellen, wie Sie auf jeden Schritt einen Schreibvorgang auf die sys.seq $ Tabelle sind gezwungen, die Knoten zu serialise hat über.
-
würde ich die akzeptierte Antwort in diesem möglich Duplikat bestreiten. Es gibt einen großen Unterschied in CACHE + ORDER und NOCACHE in RAC. Sie verneinen den CACHE nicht mit ORDER; nur seine Wirksamkeit zu reduzieren. Ich habe persönlich gesehen, dass die Leistung einer Anwendung der mittleren Ebene drastisch abnimmt, da sie NOCACHE in einer Sequenz verwendet und auf mehrere Knoten gleichzeitig zugegriffen hat. Wir wechselten ihre Reihenfolge in ORDER CACHE (da sie eine Cross-rac-Reihenfolge wollten). und Leistung drastisch verbessert.
zusammenfassend: Die Sequenzgeschwindigkeit wird vom schnellsten zum langsamsten wie "CACHE NOORDER" -> "CACHE ORDER" und Weg Weg hinter "NOCACHE" sein.
Dies ist leicht zu prüfbar:
So beginnen wir mit einer Standardsequenz:
SQL> create sequence daz_test start with 1 increment by 1 cache 100 noorder;
Sequence created.
dh CACHE ohne Ordnung. Jetzt starten wir zwei Sitzungen. Ich bin mit einem 4 Knoten RAC Datenbank 10.2.0.4 in diesem Test:
mein Testskript einfach ist
select instance_number from v$instance;
set serverout on
declare
v_timer timestamp with time zone := systimestamp;
v_num number(22);
begin
for idx in 1..100000
loop
select daz_test.nextval into v_num from dual;
end loop;
dbms_output.put_line(systimestamp - v_timer);
end;
/
/
jetzt wir den ersten Test (CACHE NOORDER) laufen:
SESSION 1 SESSION 2
SQL> @run_test SQL> @run_test
INSTANCE_NUMBER INSTANCE_NUMBER
--------------- ---------------
2 1
PL/SQL procedure successfully completed. PL/SQL procedure successfully completed.
PL/SQL procedure successfully completed. PL/SQL procedure successfully completed.
SQL> @run_test SQL> @run_test
INSTANCE_NUMBER INSTANCE_NUMBER
--------------- ---------------
2 1
+000000000 00:00:07.309916000 +000000000 00:00:07.966913000
PL/SQL procedure successfully completed. PL/SQL procedure successfully completed.
+000000000 00:00:08.430094000 +000000000 00:00:07.341760000
PL/SQL procedure successfully completed. PL/SQL procedure successfully completed.
also 7-8 Sekunden, um 100.000 Iterationen der Sequenz auszuwählen.
Jetzt versuchen wir NOCACHE (ORDER vs NOORDER ist dafür unwichtig, da wir einen Schreibvorgang auf Seq $ für jeden Aufruf der Sequenz erzwingen).
Also sind wir von 8 Sekunden auf 8 MINUTEN für den gleichen Arbeitssatz gesprungen.
was ist mit CACHE + ORDER?
SQL> alter sequence daz_test cache 100 order;
Sequence altered.
SQL> @run_test SQL> @run_test
INSTANCE_NUMBER INSTANCE_NUMBER
--------------- ---------------
2 1
+000000000 00:00:25.549392000 +000000000 00:00:26.157107000
PL/SQL procedure successfully completed. PL/SQL procedure successfully completed.
+000000000 00:00:26.057346000 +000000000 00:00:25.919005000
PL/SQL procedure successfully completed. PL/SQL procedure successfully completed.
so zusammenfassend für 100.000 einzigen Aufruf holt CACHE NOORDER = 8 Sekunden NOCACHE = 8 Minuten CACHE ORDER = 25 Sekunden
für Cache Ordnung, tun Orakel viel tun, zwischen dem RAC von Pingen Knoten, aber es DOESNT müssen Sachen zurück zu Seq $ schreiben, bis die Cachegröße aufgebraucht ist, wie es alles im Speicher getan wird.
Ich würde, wenn ich Sie wäre, eine geeignete Cachegröße einstellen (ps eine hohe Cachegröße belastet den Speicher der Box nicht, da Orakel nicht alle Zahlen im RAM speichert; nur das aktuelle + final Nummer) und berücksichtigen Sie bei Bedarf ORDER.
Danke, jetzt habe ich Gründe, mit "Cache & Order" zu gehen –
: - Ich fragte mich, können Sie mir sagen, was die Parameter sind, um die Cache-Größe einzustellen. –
Sicher. Es ist tatsächlich in meiner Probe auch. 'Erzeuge Sequenz x starte mit einem Cache n; 'wo n ist die Cache-Größe (für 0 benutze das Schlüsselwort nocache anstelle von Cache 0) – DazzaL