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