首页 > 新闻系统 > 编程天地 > 文章正文

Oracle本地管理表空间

2008-04-09 10:16:49 来源:中国自学编程网 作者:佚名 点击:
1、理解本地管理表空间的由来 2、理解什么是字典管理表空间及工作原理

直到8i之前,所有的表空间都是采用字典管理模式,为了确保能保存以上的信息,ORACLE用了两个数据字典表:UET$(已使用的区间)或FET$(空闲空间):
SQL> desc UET$ 
Name Null? Type 
----------------- ----------- ----------- 
SEGFILE# NOT NULL NUMBER 
SEGBLOCK# NOT NULL NUMBER | The segment that uses this space 
EXT# NOT NULL NUMBER 
TS# NOT NULL NUMBER | The tablespace ID and the file 
FILE# NOT NULL NUMBER | ID for that tablespace 
BLOCK# NOT NULL NUMBER 
LENGTH NOT NULL NUMBER | The location and size of the chunk 
SQL> desc FET$
Name Null? Type 
----------------- ----------- ----------- 
TS# NOT NULL NUMBER | The tablespace ID and the file 
FILE# NOT NULL NUMBER | ID for that tablespace 
BLOCK# NOT NULL NUMBER 
LENGTH NOT NULL NUMBER | The location and size of the chunk
  查询该表可以看到,每个使用空间或空闲空间(不一定是一个extent,可以是多个extent)都在该表中对应了一行。它的工作方式是当一个段被删除的时候,ORACLE就移动UET$中相应的行到FET$,这个过程的发生是连续的,而且可能发生等待。当并发性很高的时候,数据字典的争用就来了。另外有一个问题就是,当表的空间很不连续或表空间有大量的碎片引起这两个表的增大,那么也就会引起数据库性能上的下降。
本地管理表空间正是为了解决这一问题来的,在表空间的空间管理上,ORACLE将存储信息保存在表空间的头部的位图中,而不是保存在数据字典中。通过这样的方式,在分配回收空间的时候,表空间就可以独立的完成操作也不用与其它对象关系。
下面就让我们进入到本地管理表空间的内部,看看ORACLE是怎么实现这一工作的。
Uniform方式的本地管理表空间
1、先创建了一个本地管理的表空间,区间统一大小分配为64K
SQL> create tablespace demo 
datafile ’/ora01/oem/oemdemo01.dbf’ size 10m 
extent management local uniform size 64k; 
2、在该表空间中创建一个表
SQL>create table demotab ( x number ) tablespace demo 
storage ( initial 1000K next 1000k ); 
我们通过查询该表
SQL> select t.table_name,t.initial_extent,t.next_extent from user_tables t where t.table_name = ’DEMOTAB’;
TABLE_NAME INITIAL_EXTENT NEXT_EXTENT
------------------------------ -------------- -----------
DEMOTAB 1024000 65536
可以发现,该表的存储参数并不是我们指定的参数INITIAL_EXTENT,而是uniform size的整数倍,NEXT_EXTENT则等于uniform size。我们从该查询就也可以看到如下情况
SQL>select count(*) from user_extents where segment_name = ’DEMOTAB’; 
COUNT(*) 
---------- 
16 
也就是说,该表在该表空间中已经存在16个extent,而不是一个extent(这是与字典管理的差别,如果是字典管理的表空间,如果创建以上的表,该查询的结果是1)
3、获取该数据文件的文件ID
SQL> col name format a30 trunc 
SQL> select file#, name from v$datafile; 
File# NAME 
----- -------------------- 
1 /oras1/oem/oemsystem01.dbf 
2 /oras3/oem/oemundo01.dbf 
3 /ora01/oem/oemoem_repository01 
4 /ora01/oem/oemrcat01.dbf 
5 /ora01/oem/oemdemo01.dbf 
我们可以检查uet$与fet$
SQL> select count(*) from uet$ where file# = 5; 
9 7 3 1 2 3 4 5 6 4 8 :

精彩推荐
焦点大图推荐
本类热门文章

论坛美图

广告联系 | 版权说明 | 意见建议 | 加入收藏 | 军网站群 [ 军软件园 - 军软件商城 - 军软件园论坛 ]

电信与信息服务业务经营许可证:京ICP证050203