- oracle存储层次概述
1) 数据库由一个或多个表空间组成。
2) 表空间由一个或者多个文件组成,组成表空间的文件可以是文件系统上的各种文件;表空间包含段。
3) 段由一个或者多个区段组成,有table段、index段等。包含在表空间中,但是可以跨表空间内的多个文件。
4) 区段是磁盘上一组逻辑连续的块。区段只在一个表空间中,二期总是在该表空间内的一个文件中。
5) 块是数据库中最小的分配单位,也是数据库使用的最小I/O单位;在给段分配空间的时候,分配空间至少为一个块的整数被大小。
dba_tablespaces 视图可以查看表空间的定义的详细信息;这些信息可以在创建表空间create tablespace、修改表空间alter tablespace的时候进行定义。
dba_segments 视图可以查看表空间下所有段的详细信息;如果表空间被创建之后,没有被使用过(就是说如果表空间上还没有创建任何对象的话),dba_segments中将不会有任何关于该表空间的信息。查看对应表空间DEVBASE的段信息:select * from dba_segments a where a.tablespace_name='DEVBASE';由于段还是跨文件的,所以段基本信息中没有关于文件的描述。SEGMENT_NAME字段是被创建对象的名字,如表名,索引名等。
dba_extents 视图可以查看表空间下所有区段的信息;如果表空间在dba_segments中没有信息,那么在dba_extents也不会有信息;由于不会跨文件了,区段就只能位于一个文件中,所有区段信息中有一个file_id字段,标志该区段位于那个文件中。
dba_data_files 视图可以查看表空间下的文件信息,一个表空间至少需要一个文件。查询表空间下的文件信息:select * from dba_data_files a where a.tablespace_name='DEVBASE'。
根据上面几个视图的描述,对表空间的组成有了相应的了解。我们可以通过上面几个视图的组合,查看表空间的使用情况,在开发的时候选择使用恰当的表空间进行建表和建索引操作。
下面通过实例来研究这几个视图。 - 示例
我们在sys用户下创建一个表空间,创建语句如下:
create tablespace devbase
datafile '/home/ora/tbspace/devbase_20090320.dbf' size 512M
autoextend on
next 100M
maxsize 1024M;
在上面的语句中,首先简历一个512M大小的文件,初始空间为512M大小。
查看表空间信息,通过如下的语句可以查看表空间devbase的信息:
select * from dba_tablespaces a where a.tablespace_name='DEVBASE';
查看表空间文件的信息,sql语句如下,字段BYTES=536870912字节/1024/1024=512M就是文件大小。
select * from dba_data_files a where a.tablespace_name='DEVBASE';
但是在dba_extents,dba_segments中确没有DEVBASE的信息,因为还没有在表空间上创建对象。
修改表空间文件,语句如下:
ALTER DATABASE DATAFILE '/home/ora/tbspace/devbase_20090320.dbf' RESIZE 1024M;
成功之后,dba_tablespaces,dba_extents,dba_segments三个视图的记录的都没有变化。
删除数据文件要谨慎,要先把表空间的数据备份到其他的表空间之后,删除表空间,连同数据文件一起删除。
在表空间上建表,建索引:
create table staff_info
(
staff_id number(10),
staff_name varchar2(20),
addr varchar2(200)
)
tablespace devbase;
create index idx_staff_info_pid on staff_info(staff_id) tablespace devbase;
有两个段生成,段名分别为表名和索引名,语句如下:
select * from dba_segments a where a.tablespace_name='DEVBASE';
同时生成了两个区段,并分配了空间,语句如下:
select * from dba_extents a where a.tablespace_name='DEVBASE';
注意段、区段信息中bytes自己的总和都相等。
向表中插入记录来影响段、区段的信息;执行如下的脚本plsql:
begin
for i in 1..200000
loop
insert into STAFF_INFO(staff_id,Staff_Name,Addr)
values(i,'姓名','地址');
end loop;
commit;
end;
向表空插入了20万条记录。
查看表空间devbase的段信息,因为有两个对象,有两条记录:
select * from dba_segments a where a.tablespace_name='DEVBASE';
发现bytes,和blocks都增加了很多,bytes是分配的字节数,blocks是分配的块数,blocks乘以块大小就等于bytes大小。extents分别为20,19表,说明创建索引信息也非常耗空间的。
查看表空间devbase的区段信息:
select * from dba_extents a where a.tablespace_name='DEVBASE';
会看到增加了很多区段信息,有39条记录,恰好等于段信息中的extents的总和;file_id有两个,就是说两个数据文件上都创建了区段信息;bytes的在总和也等于段信息中的bytes。
表空间的可使用存储空间是所有数据文件的大小总和。
我们在上面创建表空间的时候,使用了字段扩展选项“autoextend on ”,在表空间不够使用的情况下,会按照扩展选项目,自动扩展数据文件的大小;但是使用文件自动扩展选项在管理上有一些问题,这样会数据库运行的过程中,将一些数据库文件自动扩展得太大,可能会影响到io性能;上面有很多对象和数据,不利于进行备份和日常维护;所以在创建数据文件的时候,不要把自动扩张属性打开,应该创建一些大小适当的数据文件,在表空间不够用的情况下,添加数据文件来满足要求。
下面我们删除表STAFF_INFO中的数据。
delete from STAFF_INFO;
commit;
再查看视图dba_segments和dba_extents中的信息,发现记录并没有变化;原来删除数据之后,不会修改数据字典,回手使用的表空间。
我们再次运行plsql脚本:
begin
for i in 200001..400000
loop
insert into STAFF_INFO(staff_id,Staff_Name,Addr)
values(i,'姓名','地址');
end loop;
commit;
end;
查看dba_segments和dba_extents中的信息,还是39个段,说明刚才释放的空间得到了利用。
下面再次来删除表STAFF_INFO的数据:
truncate table STAFF_INFO;
查看查看dba_segments和dba_extents中的信息,和刚创建表和索引的时候一样,说明用tuncate空间得到了回收。
这样系统在长期运行之后,不断的insert,update,delete操,可能会留下碎片。消除碎片的方法一般采用move来将对象从一个表空间移动到另外一个表空间来消除,对于一些业务系统,要根据情况定期维护,消除碎片,提高系统性能。在这儿就不再做测试了。 - 总结
表空间是维护是oracle最基本的东西,要根据具体情况进行。一般要注意如下几点:
1) 尽量减少IO的原则,可以将几个经常需要关联的表、索引建在不同的表空间,这样在执行sql的时候,可以并行地从不同的文件读取数据进行hash操作。
2) 尽量减少碎片,根据业务,对一些insert,update,delete操作比较频繁的表,定期维护,移动表空间,消除碎片。
3) 选择空间表多的表空间,通过上面几个视图,可以查出那些表空间的使用率,还剩下多少空间等。
维护oracle的表空间
最新推荐文章于 2023-12-12 10:13:55 发布