2012-11-22 21 views
10

Eventuali duplicati:
Oracle RAC and sequencesvalore Sequenza Oracle non sono ordinati

Ho un RAC Oracle configurato nel mio ambiente locale. Ho analizzato un problema con Sequnce che il numero generato da nextVal non è ordinato. Supponiamo che la prima volta ottenga il valore come 1, la seconda volta ottenga il valore 21 (ho configurato la sequenza come con CACHE 20 e NOORDER predefiniti).

Nella ricerca ho trovato la soluzione che, ho bisogno di ordinare la sequenza. Ho domanda che è meglio l'opzione di andare con,

1) CACHE e ORDER

2) NOCACHE e ORDER

Vorrei sapere quale di quanto sopra è scelta migliore e perché?

In secondo luogo, è possibile ottenere l'ordine se modifico la sequenza in modo che sia NOCACHE indipendentemente dall'ORDINE/dal NOORDER.

Grazie

risposta

15

secondo luogo, posso raggiungere l'ordinamento se modificare la sequenza di essere NOCACHE indipendentemente ORDINE/Noorder.

sì come NOCACHE è effettivamente l'ordine dato che si sta forzando una scrittura sulla tabella $ sys.seq su ogni incremento, che deve anche serializzare su nodi.

-

vorrei contestare la risposta accettata in quel possibili duplicati. c'è un'enorme differenza in CACHE + ORDER e NOCACHE in RAC. Non stai negando il CACHE con l'ORDINE; solo riducendo la sua efficacia. Personalmente ho visto le prestazioni di un'applicazione di livello medio degradarsi drasticamente mentre utilizzavano NOCACHE su una sequenza e stavano accedendo su più nodi contemporaneamente. Abbiamo cambiato la sequenza in ORDER CACHE (perché volevano un ordine di cross-rac). e le prestazioni drasticamente migliorate.

in sommario: la velocità della sequenza sarà da più rapida a più lenta come "CACHE NOORDER" -> "CACHE ORDER" e modo via WAY dietro "NOCACHE".

Questo è facilmente verificabile troppo:

Così si comincia con una sequenza standard:

SQL> create sequence daz_test start with 1 increment by 1 cache 100 noorder; 

Sequence created. 

cioè CACHE senza ordine. Ora apriamo due sessioni. Sto usando un database RAC 4 nodo 10.2.0.4 in questo test:

il mio script di test è semplicemente

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;             
/
/

ora corriamo il primo test (Noorder CACHE):

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. 

quindi 7-8 secondi per selezionare 100.000 iterazioni della sequenza.

Ora proviamo NOCACHE (ORDER vs NOORDER è irrilevante per questo, dato che stiamo forzando una scrittura su seq $ per ogni chiamata alla sequenza).

SQL> alter sequence daz_test nocache; 

Sequence altered. 

SESSION 1          SESSION 2 
SQL> @run_test         SQL> @run_test 

INSTANCE_NUMBER         INSTANCE_NUMBER 
---------------         --------------- 
       2            1 

+000000000 00:08:20.040064000     +000000000 00:08:15.227200000 

PL/SQL procedure successfully completed.  PL/SQL procedure successfully completed. 

+000000000 00:08:30.140277000     +000000000 00:08:35.063616000 

PL/SQL procedure successfully completed.  PL/SQL procedure successfully completed. 

quindi siamo passati da 8 secondi a 8 MINUTI per lo stesso set di lavoro.

che dire di CACHE + ORDINE?

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. 

Quindi, in sintesi per 100.000 singola chiamata recupera CACHE Noorder = 8 secondi nocache = 8 minuti CACHE order = 25 secondi

per ordine di cache, Oracle non fare un sacco di rumore metallico tra il RAC nodi, ma è DOESNT devono scrivere di nuovo a seq $ fino a quando la dimensione della cache è esaurita, come tutto viene fatto in memoria.

se fossi in te, imposta una dimensione della cache appropriata (ps una dimensione della cache elevata non carica sulla memoria della casella, poiché oracle non memorizza tutti i numeri nella RAM, solo la corrente + finale numero) e prendere in considerazione l'ORDINE se necessario.

+0

Grazie, ora ho motivi per andare con "Cache & Order" –

+0

: - Mi stavo chiedendo che puoi dirmi quali sono i parametri per impostare la dimensione della cache. –

+0

Sicuro. È anche nel mio esempio. 'Crea una sequenza x inizia con una cache n; 'dove n è la dimensione della cache (per 0 usa la parola chiave nocache invece della cache 0) – DazzaL

Problemi correlati