今天演示一下表的存储参数Freelist(自由列表)对性能的影响
我们知道,在对表进行大数据量的插入和更新时,配置多个Freelist能提高整体性能,然而配置多个Freelist有可能浪费更多的空间,一定要找出并行
插入和更新的最大数,
下面例子说明这点
我们创建一个表
SQL> conn hr/hr123
已连接。
SQL> drop table t;
表已删除。
SQL> create table t (x int );
创建一个临时表,用来存放v$waitstat表中的数据
SQL> create global temporary table waitstat_before
2 on commit preserve rows (表示会话中止时或者导常退出时数据都会被清除掉)
3 as
4 select * from v$waitstat
5 where 1=0;
表已创建。
SQL> select * from waitstat_before;
未选定行
SQL> insert into waitstat_before
2 select * from v$waitstat;
已创建18行。
下面我们开始两个会话往T表同时插入数据
SQL> ed
已写入 file afiedt.buf
1 begin
2 for i in 1 .. 100000
3 loop
4 insert into t values (i);
5 commit;
6 end loop;
7* end;
SQL> /
PL/SQL 过程已成功完成。
另一个会话也同时执行
SQL> ed
已写入 file afiedt.buf
1 begin
2 for i in 1 .. 100000
3 loop
4 insert into t values (i);
5 commit;
6 end loop;
7* end;
SQL> /
PL/SQL 过程已成功完成。
我们查询表
select a.class ,b.count-a.count count , b.time-a.time time
from hr.waitstat_before a ,v$waitstat b
where a.class = b.class;
执行入下结果:
SQL> select a.class ,b.count-a.count count , b.time-a.time time
2 from waitstat_before a ,v$waitstat b
3 where a.class = b.class;
CLASS COUNT TIME
------------------ ---------- ----------
data block 860 2541
sort block 0 0
save undo block 0 0
segment header 1 2
save undo header 0 0
free list 0 0
extent map 0 0
1st level bmb 0 0
2nd level bmb 0 0
3rd level bmb 0 0
bitmap block 0 0
CLASS COUNT TIME
------------------ ---------- ----------
bitmap index block 0 0
file header block 0 0
unused 0 0
system undo header 0 0
system undo block 0 0
undo header 181 58
undo block 0 0
已选择18行。
SQL>
我们看到,当这些会话并行运行时,等待超过25秒,这完全是由于在表t中没有为并行任务配置足够的Freelist,下面改变Freelist的大小
SQL> alter table t storage(freelists 3);
alter table t storage(freelists 3)
*
第 1 行出现错误:
ORA-10620: Operation not allowed on this segment
这是由于oracle11g默认为自动段空间管理,在这种模式下,Oracle不能修改表的存储参数
select tablespace_name,extent_management,segment_space_management from dba_tablespaces where tablespace_name='EXAMPLE';
TABLESPACE_NAME EXTENT_MAN SEGMEN
------------------------------ ---------- ------
EXAMPLE LOCAL AUTO
下面我们创建一个手动段空间管理的表空间
SQL> create tablespace manual_tbs
2 datafile '/u01/app/oracle/oradata/R2/manual_tbs01.dbf' size 100M
3 extent management local
4 segment space management manual;
表空间已创建。
SQL> create user dm identified by dm default tablespace manual_tbs;
用户已创建。
SQL> conn dm/dm
ERROR:
ORA-01045: 用户 DM 没有 CREATE SESSION 权限; 登录被拒绝
授权dba角色给dm用户
SQL> conn / as sysdba
已连接。
SQL> grant dba to dm;
授权成功。
SQL> conn dm/dm
已连接。
SQL> create table t (x int);
表已创建。
SQL> alter table t storage (freelists 2);
表已更改。
SQL> truncate table hr.waitstat_before;
表被截断。
SQL> ed
已写入 file afiedt.buf
1 insert into hr.waitstat_before
2* select * from v$waitstat
SQL> /
已创建18行
SQL> ed
已写入 file afiedt.buf
1 begin
2 for i in 1 .. 100000
3 loop
4 insert into t values (i);
5 commit;
6 end loop;
7* end;
SQL> /
PL/SQL 过程已成功完成。
SQL>
我们再次查询
SQL> select a.class ,b.count-a.count count , b.time-a.time time
from hr.waitstat_before a ,v$waitstat b
2 where a.class = b.class;
3
CLASS COUNT TIME
------------------ ---------- ----------
data block 0 0
sort block 0 0
save undo block 0 0
segment header 0 0
save undo header 0 0
free list 0 0
extent map 0 0
1st level bmb 0 0
2nd level bmb 0 0
3rd level bmb 0 0
bitmap block 0 0
CLASS COUNT TIME
------------------ ---------- ----------
bitmap index block 0 0
file header block 0 0
unused 0 0
system undo header 0 0
system undo block 0 0
undo header 2 0
undo block 0 0
已选择18行。
等待时间已经消除
可见,freelists存储参数对大数据量的插入和更新的性能有很大影响。那么我们在做批量数据操作的时候,可以临时改变表的存储参数,可以很好的提高数据库的性能,不过在Oracle10g以后,默认表空间的管理方式为自动。要想修改表的存储参数,表空间必须为手动段空间管理。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7551038/viewspace-617045/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/7551038/viewspace-617045/