在客户现场中,查看v$logk.type出现大量的TO (temporary object),该锁类型
很少触及到,不知道对数据库有多大影响,因此编写以下的测试程序进行检测:
1、创建事务型临时测试表
SQL>connect test/test
SQL>create global temporary table t1(
date_ord date constraint t1_dto_nn not null,
seq_ord number(6) constraint t1_sqo_nn not null,
small_vc varchar2(10),
big_vc varchar2(40)
) on commit preserve rows;
2、创建sequence
SQL>create sequence t1_seq;
3、创建存储过程
SQL>connect /as sysdba
SQL>grant execute on dbms_lock to test;
SQL>connect test/test
create or replace procedure t1_load(i_tag varchar2) as
m_date date;
m_big_vc varchar2(40);
m_start_time date;
m_end_time date;
BEGIN
dbms_output.put_line(
dbms_lock.request(
1,dbms_lock.s_mode, release_on_commit=>true)
);
commit;
m_start_time := sysdate;
for i in 0..40 loop
m_date := trunc(sysdate)+i;
m_big_vc := rpad('x',40);
for j in 1..200 loop
insert into t1 values(
m_date,
t1_seq.nextval,
i_tag||j,
m_big_vc
);
commit;
dbms_lock.sleep(0.01);
end loop;
end loop;
m_end_time :=sysdate;
dbms_output.put_line('Interval Time ['||i_tag||'] ='||trunc(86400*(m_end_time-m_start_time))||'Seconds');
end;
/
4、测试,启动用户锁,让多个session同时进行插入动作
session 1:
SQL>BEGIN
dbms_output.put_line(
dbms_lock.request(
1, dbms_lock.x_mode,
release_on_commit=>true)
);
end;
/
**************************************
加载多个并行插入进程
**************************************
session 2:
SQL>exec t1_load('A');
session 3:
SQL>exec t1_load('B');
............
session N:
SQL>exec t1_load('N');
*******************************
触发多个并行进程执行插入
*******************************
session 1:
SQL> commit;
SQL>select * from v$lock where type='TO';
5、测试结论:
从测试结果中,我们发现大量的TO锁类型,无论并行执行的session数量是多少,
每个session的插入时间没有变化,即使session完成了insert操作, v$lock.type
=TO并不会消失,只有session退出之后才消失。因此对数据库的性能没有影响。
很少触及到,不知道对数据库有多大影响,因此编写以下的测试程序进行检测:
1、创建事务型临时测试表
SQL>connect test/test
SQL>create global temporary table t1(
date_ord date constraint t1_dto_nn not null,
seq_ord number(6) constraint t1_sqo_nn not null,
small_vc varchar2(10),
big_vc varchar2(40)
) on commit preserve rows;
2、创建sequence
SQL>create sequence t1_seq;
3、创建存储过程
SQL>connect /as sysdba
SQL>grant execute on dbms_lock to test;
SQL>connect test/test
create or replace procedure t1_load(i_tag varchar2) as
m_date date;
m_big_vc varchar2(40);
m_start_time date;
m_end_time date;
BEGIN
dbms_output.put_line(
dbms_lock.request(
1,dbms_lock.s_mode, release_on_commit=>true)
);
commit;
m_start_time := sysdate;
for i in 0..40 loop
m_date := trunc(sysdate)+i;
m_big_vc := rpad('x',40);
for j in 1..200 loop
insert into t1 values(
m_date,
t1_seq.nextval,
i_tag||j,
m_big_vc
);
commit;
dbms_lock.sleep(0.01);
end loop;
end loop;
m_end_time :=sysdate;
dbms_output.put_line('Interval Time ['||i_tag||'] ='||trunc(86400*(m_end_time-m_start_time))||'Seconds');
end;
/
4、测试,启动用户锁,让多个session同时进行插入动作
session 1:
SQL>BEGIN
dbms_output.put_line(
dbms_lock.request(
1, dbms_lock.x_mode,
release_on_commit=>true)
);
end;
/
**************************************
加载多个并行插入进程
**************************************
session 2:
SQL>exec t1_load('A');
session 3:
SQL>exec t1_load('B');
............
session N:
SQL>exec t1_load('N');
*******************************
触发多个并行进程执行插入
*******************************
session 1:
SQL> commit;
SQL>select * from v$lock where type='TO';
5、测试结论:
从测试结果中,我们发现大量的TO锁类型,无论并行执行的session数量是多少,
每个session的插入时间没有变化,即使session完成了insert操作, v$lock.type
=TO并不会消失,只有session退出之后才消失。因此对数据库的性能没有影响。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/354732/viewspace-689863/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/354732/viewspace-689863/
1万+

被折叠的 条评论
为什么被折叠?



