oracle转移表空间和索引

        在日常和oracle数据库打交道的过程中,也许会遇到在system表空间建了非sys或system的段的现象。时间久了,随着数据量的激增,数据库会变的越来越慢,笔者在实际工作中遇到了这种问题。若干用户的表全部建大了system表空间,真地感叹当时创建数据库的大才,于是就那次转移表空间做一下总结,与大家分享。

       其实像转移表空间和索引的语句网上多的是,我就把我做的每一步和遇到的问题写一下吧。

       首先,转移表空间,语句如下:

        alter table user move tablespace newspace; 

       利用:select 'alter table '||table_name||' move tablespace newspace ;'from user_tables where owner='scott';将转移用户表空间的语句拼出来,不用多说,大家都知道。

       然后将语句拷出执行。

       然后,转移索引,语句如下:

      alter index idx_user rebuild tablespace newspace;

      利用:select 'alter index '||index_name||' rebuild tablespace newspace ;'from user_indexes where owner='scott';

      其实,对于索引来说最好和表不在同一个表空间中,这样对数据库及以后的查询效率更好些。另外,对于索引,最好定期进行一下重构,重构之前,最好能先分析一下索引哪些不经常用到,哪些经常使用,以及对于某个表来说怎样建索引更合适。

      执行拼接出来的sql语句,但发现一些语句执行不成功。检查执行不成功的语句突然发现一个索引为:DMJ-DWX-PK_1,不能转移,反复尝试都不可以。后来查资料发现索引中不能包含 ‘-’字段,否则oracle认为这是个选项,这 是不允许的。但不幸的是这个索引还是一个主键索引(oracle默认为主键建立索引),无奈,删了重建。禁用或删除主键必须与ALTER TABLE 语句一起使用,语句如下:

    ALTER TABLE policies DROP PRIMARY KEY;
  或
    ALTER TABLE policies DISABLE PRIMARY KEY;
增加主键  alter table DMJ_DWX add constraint DMJ_DWX_PK_1 primary key (BZH, P);

     后来发现还是有一些索引无法转移表空间,于是查找此索引的表,发现表中有BLOB类型的字段,用  alter index idx_user rebuild tablespace newspace;肯定是不可以的。这属于Lob类型索引转移。

      在oracle中,增加lob列后,会另外增加了两个明显是系统命名的段对象,类型分别为lobsegment和lobindex,即lob段和lob索引段。

      Lob段(LobSegment)对应的是存放在数据表lob列上的数据。在Oracle的lob类型数据列,有两种保存位置结构。一个是in-row storage,也就是每一行的lob数据同其他列的数据以行的形式一起保存在数据块中。这种情况的lob列取值较小。而另一种为out-of-row storage,当lob对象较大,不能保存在一个数据块中时,可以将其放置在一个独立lobsegment中进行保存。而out-of-row storage时数据行中lob列上保存的只是一个指向lobsegment对应位置的指针引用。
       Lob索引段(LobIndex)是Oracle为每一个lob类型列强制生成的索引,主要作用是用于进行lob类型数据检索加速的操作。Lobindex与lob列共生,如果强制进行删除操作,是会报错的。

      当表T转移到另一个表空间上后,Lob段和对应的lobindex段没有变化。如果需要移动lob/lobindex,需要额外的单独操作。Lobindex是不能使用rebuild直接重构的。

      使用alter table xxx move lob(xx) store as xxx (tablespace xxx);命令,我们可以进行lob列的存储位置调节。注意:lob(xx)中的xx为表中lob类型的列名。

      可以做如下测试,查看修改过程:

-----先查找表的LobIndex,LobSegment

select  table_name,column_name,segment_name,index_name from user_lobs  where table_name = 'CLDE_XCJS' ;

结果:CLDE_XCJS GRAPH   SYS_LOB0000009622C00003$$   SYS_IL0000009622C00003$$
------修改表中lob类型的表空间
alter table CLDE_XCJS move lob(GRAPH) store as SYS_LOB0000009622C00003$$ (tablespace IDATA); ;
----查看修改情况
select segment_name, segment_type, tablespace_name from user_segments
where segment_name = 'SYS_LOB0000009622C00003$$' or segment_name = 'CLDE_XCJS' or
 segment_name ='SYS_IL0000009622C00003$$' ;

    可以先在修改前查一下各字段的表空间然后修改后再查看一下,对比一下。








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值