Bonjour,
J'utilise une table oracle pour synchroniser des processus .net et Oracle. Les nombres énormes d’insert/delete fait ralentir toutes la DB (600% du processeur).
Dans la table j'ai maximum 30 lignes.
Y aurait-il une solution pour ce genre de problématique.
Merci beaucoup.
Code utilisé:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 -- Create table create table LCK ( LCK_ID NUMBER(38), LCK_NME VARCHAR2(1000 BYTE) not null, DTE DATE default sysdate not null, DTE_REQ DATE, SES_REQ VARCHAR2(100) ); -- Create/Recreate primary, unique and foreign key constraints alter table LCK add constraint P_LCK primary key (LCK_ID); -- Create/Recreate indexes create unique index U_LCK on LCK (LCK_NME);
Request Lock
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 procedure request_lock_table(lock_id in number, lock_name in varchar2, request_date in date, request_session in varchar2) is pragma autonomous_transaction; v_request_date date; v_count number(28); begin select nvl(request_date, sysdate) into v_request_date from dual; begin select count(*) into v_count from lck where lck_id = lock_id; if (v_count != 0) then dbms_lock.sleep(0.5); request_lock_table(lock_id, lock_name, request_date, request_session); else insert into lck (lck_id, lck_nme, dte, dte_req, ses_req) values (lock_id, lock_name, sysdate, request_date, request_session); commit; end if; exception when dup_val_on_index then dbms_lock.sleep(0.5); request_lock_table(lock_id, lock_name, request_date, request_session); when others then raise_application_error(-20000, 'request lock failed (' || sqlcode || ') :' || sqlerrm); end; end request_lock_table;
Release Lock
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 procedure release_lock_table(lock_id in number) is pragma autonomous_transaction; begin begin -- Delete specific lock delete from lck where lck_id = lock_id; commit; exception when others then raise_application_error(-20000, 'release lock failed: ' || lock_id); end; begin -- Delete the locks when the start date is more than 10 minutes delete from lck where dte < sysdate - (10 / 1440); commit; exception when others then raise_application_error(-20000, 'release old lock failed'); end; end release_lock_table;
Partager