维护oracle的表空间

  1.  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'。

    根据上面几个视图的描述,对表空间的组成有了相应的了解。我们可以通过上面几个视图的组合,查看表空间的使用情况,在开发的时候选择使用恰当的表空间进行建表和建索引操作。

    下面通过实例来研究这几个视图。
  2. 示例
    我们在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来将对象从一个表空间移动到另外一个表空间来消除,对于一些业务系统,要根据情况定期维护,消除碎片,提高系统性能。在这儿就不再做测试了。
  3. 总结
    表空间是维护是oracle最基本的东西,要根据具体情况进行。一般要注意如下几点:
    1) 尽量减少IO的原则,可以将几个经常需要关联的表、索引建在不同的表空间,这样在执行sql的时候,可以并行地从不同的文件读取数据进行hash操作。
    2) 尽量减少碎片,根据业务,对一些insert,update,delete操作比较频繁的表,定期维护,移动表空间,消除碎片。
    3) 选择空间表多的表空间,通过上面几个视图,可以查出那些表空间的使用率,还剩下多少空间等。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值