ITPub博客

首页 > 数据库 > Oracle > oracle表空间管理

oracle表空间管理

Oracle 作者:dawn009 时间:2014-03-21 17:20:14 0 删除 编辑
extent--最小空间分配单位 --tablespace management
block --最小i/o单位      --segment    management

create tablespace james
datafile '/export/home/oracle/oradata/james.dbf'
size 100M       --初始的文件大小 
autoextend On     --自动增长
next 10M      --每次自动增长大小 
maxsize 2048M     --最大文件大小
extent management local --表空间采用本地表空间管理
uniform size 128k    --uniform设置extent每次分配的大小统一为128k(如果是db_block_size=8k
,则每次分配16个块) 
                            --如果不指定大小,则为1M,即为1024/8个block
                           --autoallocate设置extent大小由系统自动分配
                           --不管系统大小分配为多少,但统一尺寸是64k(在bitmap中标记位的大小)。
                            --autoallocate在dba_extents中的allocation_type中显示为 SYSRTEM
segment space management auto;
                        --segment中的block管理有两种:MSSM(Manual Segment Space Management),
ASSM(Auto Systemt Space Management)
                        --Auto 模式时只有pctfree参数起作用
--Manual 模式时freelist,pctfree,pctused参数起作用。



Tablespace 管理方式有两种:(管理extent)


1 数据字典空间管理 dictionary managed tablespace
   通过管理两个主要的数据字典表,UET$(Used EXtends) 和FET$(Free EXtends)来实现
   在9i以后已淘汰
   缺点:1 并发访问争用
              2 产生大量redo undo
              3 空间碎片

2 本地表空间管理 Local managed tablespace 
   位图管理
   数据文件头部加入位图区域
   extent management local
   
   具体空间分配方式:
   1 autoallocate ----allocation_type=system
   2 uniform         ----allocation_type=uniform

ALLOCATION_TYPE 这个值有3个选项:
1、system:一旦设定该值,next_extent将为空,只有extents值。该值是默认值。这个选项的最小是64K
2、 user:一旦设定该值,就允许我们可以控制next_extent了。只有两种情况出现users:一是该ts是数据字典管理的;另外一个是该ts是从 数据字典管理转移到local的(用dbms_space_admin.tablespace_migrate_to_local)
3、uniform:将标明所有的extent的大小将一致,temp表空间只能采用这个方式;以上两个情况的extent的大小将不一致;uniform中的默认值为1M


              
未使用过的tablespace中新建第一个表t1

james@O10G>create table t1 (x int);

Table created.

sys@O10G>select extent_id,file_id,blocks,block_id,owner from dba_extents where owner='JAMES';

EXTENT_ID    FILE_ID     BLOCKS   BLOCK_ID OWNER
---------- ---------- ---------- ---------- ------------------------------
         0            7          16             9                 JAMES

bolck_id直接从9开始,前面的8个block留作他用
1-2位
 是文件头信息
3-8位 是位图信息

dump 出这个文件头看看

主要信息如下
File Space Bitmap Block:
BitMap Control:
RelFno: 7, BeginBlock: 9, Flag: 0, First: 1, Free: 63487
已经分配了1个extent 还有63487是free可以使用的



Segment 管理方式有两种:(管理Block)

1 MSSM(Manual Segment Space Management)
2 ASSM(Auto Systemt Space Management)


1 MSSM(Manual Segment Space Management)
通过在segment的段头分配自由列表(freelist)来管理block
通过两个参数 pctfree pctused来管理block如何进出freelist
pctfree 值表示预留多少%的block空间用于更新
pctused 值表示低于这个值是,block会重新加入到freelist上

通过dba_tables,dba_indexes查看freelist,pctfree,pctused等参数的设置

2 ASSM(Auto Systemt Space Management)
通过在segment的段头分配位图(bitmap)来管理block
不再需要freelist 
不在需要pctused,因为不需要从freelist上摘除block。
前面提到了数据文件上block1-2是数据头文件,block3-8是extent的位图。
block9-10是ASSM的block的一级和二级位图。
ASSM最大支持三级为图,但是一般非常难见到使用三级目录的

------>>表空间对应文件的AUTOEXTEND ON NEXT指定的值对性能的影响:
创建表空间是指定的数据文件可以设为自动扩展,以及每次扩展多少容量,如果发现在大数据量插入的时候非常慢,可能的原因是NEXT指定的值太小.
 
下面来模拟一下这个过程:
1,创建一个表空间:  www.2cto.com  
CREATE TABLESPACE "T" DATAFILE 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\T.DBF' SIZE 5M 
默认的话是不自动扩展的:
SQL> select file_id, tablespace_name,autoextensible, increment_by
  2  from dba_data_files where tablespace_name='T';
   FILE_ID TABLESPACE_NAME                AUT INCREMENT_BY
---------- ------------------------------ --- ------------
         8 T                              NO             0
 
2,如果插入的数据超过5M,会出错
SQL>  create table largeinsert tablespace t as select * from dba_objects;
 create table largeinsert tablespace t as select * from dba_objects                                                        *
ERROR at line 1:
ORA-01652: unable to extend temp segment by 128 in tablespace T
3,将表空间修改为自动扩展:
SQL> alter database datafile 8 autoextend on;
Database altered.  www.2cto.com  
SQL> select file_id, tablespace_name,autoextensible, increment_by
  2  from dba_data_files where tablespace_name='T';
 
   FILE_ID TABLESPACE_NAME                AUT INCREMENT_BY
---------- ------------------------------ --- ------------
         8 T                              YES            1
 
默认每次扩展是1个byte,这对于大数据量插入是很慢的.
14:41:00 SQL> create table largeinsert tablespace t as select * from dba_objects;
Table created.
14:41:04 SQL>
14:41:18 SQL> insert into largeinsert select * from largeinsert;
51017 rows created.
14:41:26 SQL> insert into largeinsert select * from largeinsert;
102034 rows created.
14:41:34 SQL> insert into largeinsert select * from largeinsert;
204068 rows created.
14:41:59 SQL>
14:42:13 SQL> insert into largeinsert select * from largeinsert;
408136 rows created.
14:42:44 SQL>
 
在另一种情况下,可以发现将每次扩展的容量设置为较大的值,性能会有提升.
CREATE TABLESPACE "T2" DATAFILE 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\T2.DBF' 
SIZE 50M  autoextend on next 20M
SQL> select file_id, tablespace_name,autoextensible, increment_by
  2  from dba_data_files where tablespace_name='T2';
 
   FILE_ID TABLESPACE_NAME                AUT INCREMENT_BY
---------- ------------------------------ --- ------------
         9 T2                             YES         2560
14:45:07 SQL> create table largeinsert2 tablespace t2 as select * from dba_objects;
Table created.  www.2cto.com  
14:45:11 SQL>
14:45:14 SQL>
14:45:26 SQL> insert into largeinsert2 select * from largeinsert2;
51018 rows created.
14:45:28 SQL> insert into largeinsert2 select * from largeinsert2;
102036 rows created.
14:45:35 SQL> insert into largeinsert2 select * from largeinsert2;
204072 rows created.
14:45:40 SQL> insert into largeinsert2 select * from largeinsert2;
408144 rows created.
14:46:08 SQL>(这一次也会有多次的20M的扩展申请)

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29119536/viewspace-1126908/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2013-08-15

  • 博文量
    595
  • 访问量
    4988611