Rechercher dans ce blog

jeudi 23 février 2012

Sequence RAC

Sequence RAC


Problèmes:
Table  avec   un  id, cet id  est  mis a  jour par  une sequence   du  type
Insert   into  table A (select  seqA.nextval  from  dual);
La continuité des  insert  n  est  pas présente  (astuces de  contournement  des  select  order by  ou  vue)

On travaille  en  rac  2 noeuds donc en  parallele.

Au  niveau  de la  création  on a  plusieurs  options mais  aucune  ne permet de garantir  que l ordre des insert  se suivra  quand on fait  du  parallélisme
 Option des  sequences :
Cache
Order
cycle


1 -  J ai créé     un service  testseq   avec  Load  balancing  sur les  2  nodes.

srvctl  add service -d PREPROD -s testseq -r PREPROD1,PREPROD2
srvctl   start   service  -d PREPROD  -s testseq

2 - J’ai   créé 6  tables :

create   table   MG.T_test_rac_noorder (numero number);   
create   table   MG.T_test_rac_order(numero number);
create   table   MG.T_test_rac_noorder_c5000 (numero number);   
create   table   MG.T_test_rac_order_c5000 (numero number);
create   table   MG.T_test_rac_NC_order (numero number);
create table MG.T_test_rac_NC_Noorder (numero  number);

J’ai créé  6 séquences :

create   sequence MG.test_rac_noorder MINVALUE 1 MAXVALUE 999999999999999999999999999 INCREMENT BY 1 START WITH 1  cache 20 NOORDER  NOCYCLE;
create   sequence MG.test_rac_order MINVALUE 1 MAXVALUE 999999999999999999999999999 INCREMENT BY 1 START WITH 1  cache 20 ORDER  NOCYCLE;

create   sequence MG.test_rac_order_c5000 MINVALUE 1 MAXVALUE 999999999999999999999999999 INCREMENT BY 1 START WITH 1  cache 5000 ORDER  NOCYCLE;
 create   sequence MG.test_rac_noorder_c5000 MINVALUE 1 MAXVALUE 999999999999999999999999999 INCREMENT BY 1 START WITH 1  cache 5000 NOORDER  NOCYCLE;

create   sequence MG.test_rac_NC_order MINVALUE 1 MAXVALUE 999999999999999999999999999 INCREMENT BY 1 START WITH 1  nocache ORDER  NOCYCLE;

 create   sequence MG.test_rac_NC_noorder MINVALUE 1 MAXVALUE 999999999999999999999999999 INCREMENT BY 1 START WITH 1  nocache  NOORDER  NOCYCLE;

j ai créé 6  boucles   pour  insérer 50000  rows :

begin
for i in 1..50000 loop
--insert  into  T_test_rac_NOorder  (select test_rac_Noorder.nextval  from  dual);
--insert  into  T_test_rac_order  (select test_rac_order.nextval  from  dual);

--insert  into  T_test_rac_order_C5000  (select test_rac_order_C5000.nextval  from  dual);
--insert  into  T_test_rac_noorder_C5000  (select test_rac_noorder_C5000.nextval  from  dual);
--insert  into  T_test_rac_NC_order  (select test_rac_NC_order.nextval  from  dual);
 insert  into  T_test_rac_NC_NOorder  (select test_rac_NC_Noorder.nextval  from  dual);
commit;
end loop;
end;
/

Puis  j ai  ouvert  2  sessions  une sur chaque nœuds  en  passant  par  le  service  créer  ci  dessus  pour faire les inserts ( 100000  inserts)


Conclusion
Dans   tous  les  cas   on  a  pas une continuité des  numéros  au  moments des inserts   voir   des numéros  manquants  mais  on  a  jamais de doublons.

Un  flush  de  la shared_pool ou  un arrêt  d une  séquence génère  un gap.

Au niveau  performance le  pire cas  sont :
Nocache noorder  et  nocache order  plus de  10  minutes  .

Le  meilleurs cas   est  cache 5000  est  order  environ  25 secondes  pour  100000  inserts.

Note  metalink  853652.1

Aucun commentaire:

Enregistrer un commentaire