环境补充一点: 存储是DELL EMC 使用的是RAW
步骤1:分析现象
在2个节点对单表同时插入100万条记录,生成STATSPACK报告TOP EVENTS如下:
Top 5 Timed Events
~~~~~~~~~~~~~~~~~~ % Total
Event Waits Time (s) Ela Time
-------------------------------------------- ------------ ----------- --------
global cache open x 5,795 242 66.25
CPU time 42 11.39
DFS lock handle 2,858 38 10.40
global cache null to x 3,392 13 3.49
log file parallel write 3,995 7 1.84
登陆METALINK,查找global cache open x 的原因,其中有的是BUG原因,有的是参数原因,由于我的是9.2.0.4.0,基本排除BUG的原因,那么主要问题可能就是出在存储参数上了,下面是我调整参数测试的过程
步骤2 测试过程
1、 删除表空间 hs_bond_data(改表空间使用的LV名称是HS_BOND_DATA01 大小2G)
Drop tablespace hs_bond_data including contents;
2、 用空闲下来的LV新建测试表空间
CREATE TABLESPACE "TBSTEST"
LOGGING
DATAFILE '/dev/vg_rac/rHS_BOND_DATA01' SIZE 2000M EXTENT
MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO
3、 建立测试用户和测试表
Sqlplus “/as sysdba”
Create user testtbs identified by testtbs default tablespace TBSTEST temporary tablespace temp;
Grant create session,connect,create procedure to testtbs;
alter user testtbs quota 2000m on tbstest;
Conn testtbs/testtbs
Create table test(col1 varchar2(100),col2 varchar2(100));
4、 建存储过程
create or replace procedure insertxxxx is
begin
for i in 1..1000000 loop
insert into test values('1','1');
end loop;
commit;
end insertxxxx;
5、 在2个接点上分别同时运行该存储过程,记下运行时间
节点1(omsrac1) 65.672s
节点2(omsrac2) 64.329s
单独在节点1运行一个线程
节点1(omsrac1) 38.407s
单独在节点1运行2个线程
节点1(omsrac1)41.141s和41.484s
6、 修改TEST的存储参数后继续第5步的测试
drop table test;
Create table test(col1 varchar2(100),col2 varchar2(100))
storage(FREELISTS 4 FREELIST GROUPS 2);
在2个接点上分别同时运行该存储过程,记下运行时间
节点1(omsrac1) 64.125s
节点2(omsrac2) 63.969s
单独在节点1运行一个线程
节点1(omsrac1) 39.156s
单独在节点1运行2个线程
节点1(omsrac1)42.344s和41.812s
7、 将6中建的表移到手动段管理表空间,继续6步的测试
Alter table test move tablespace HS_USER_IDXHIS
在2个接点上分别同时运行该存储过程,记下运行时间
节点1(omsrac1) 82.625s
节点2(omsrac2) 44.563s
重复测试在2个接点上分别同时运行该存储过程,记下运行时间
节点1(omsrac1) 41.703s
节点2(omsrac2) 79.531s
单独在节点1运行一个线程
节点1(omsrac1) 38.391s
单独在节点1运行2个线程
节点1(omsrac1)43.672s和44。14s
8、 重新调整表TEST的存储参数,再次进行步骤6的测试
drop table test;
Create table test(col1 varchar2(100),col2 varchar2(100))
tablespace HS_USER_IDXHIS
storage(initial 10240k FREELISTS 4 FREELIST GROUPS 2);
在2个接点上分别同时运行该存储过程,记下运行时间
节点1(omsrac1) 44.734s
节点2(omsrac2) 45.188s
单独在节点1运行一个线程
节点1(omsrac1) 39.125s
单独在节点1运行2个线程
节点1(omsrac1)41.422s和42.609s
3、测试结论
1、 如果段空间管理用AUTO,那么指定的一些存储参数将不起作用,可以提高性能,但是效果不很明显
2、 如果段空间管理用MANUAL,那么指定的存储参数都有效,根据需求调整存储参数,对性能提高很大
3、 在段空间管理用MANUAL通过调整FREELISTS和FREELIST GROUPS参数可以提高插入性能
至此问题已经解决