2012-11-22 7 views
10
bestellt

Mögliche Duplizieren:
Oracle RAC and sequencesOracle Sequence-Wert werden nicht

Ich habe eine Oracle RAC in meinem lokalen Umgebung konfiguriert. Ich habe ein Problem mit Sequnce analysiert, dass die von nextVal erzeugte Zahl nicht geordnet ist. Angenommen, ich erhalte zum ersten Mal den Wert 1, zum zweiten Mal bekomme ich den Wert 21 (Ich habe die Sequenz wie mit CACHE 20 und NOORDER konfiguriert).

Bei der Suche fand ich die Lösung, dass ich die Reihenfolge bestellen muss. Ich habe eine Frage, die eine bessere Option zu gehen,

1) CACHE und ORDER

2) NOCACHE und ORDER

Ich möchte wissen, welche der oben bessere Option ist, und warum?

Zweitens, kann ich die Reihenfolge erreichen, wenn ich die Reihenfolge zu NOCACHE unabhängig von ORDER/NOORDER ändern.

Dank

Antwort

15

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.

+0

Danke, jetzt habe ich Gründe, mit "Cache & Order" zu gehen –

+0

: - Ich fragte mich, können Sie mir sagen, was die Parameter sind, um die Cache-Größe einzustellen. –

+0

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

Verwandte Themen