alter table ... move


select owner , segment_name , bytes/1024/1024 M from dba_Segments where owner ='YAO';
OWNER SEGMENT_NAME                             M
----- -------------------------------------- ----------
YAO T2                                        .25
YAO T1                                        .375
YAO T3                                        .0625
YAO TEST                                       88
YAO BIN$DO48gPl3uQbgUAoKBgo50w==$0             6
YAO LOGIN_TAB                                  .0625
6 rows selected.
Elapsed: 00:00:00.10
00:45:48 SQL> alter table YAO.test move;
Table altered.
Elapsed: 00:00:00.33
00:46:12 SQL> select owner , segment_name , bytes/1024/1024 M from dba_Segments where owner ='YAO';
OWNER SEGMENT_NAME                              M
----- ---------------------------------------- ----------
YAO TEST                                       .0625
YAO T2                                         .25
YAO T1                                         .375
YAO T3                                         .0625
YAO BIN$DO48gPl3uQbgUAoKBgo50w==$0             6
YAO LOGIN_TAB                                  .0625
6 rows selected.



17:06:55 SQL> alter table emp1 move;
Table altered.
Elapsed: 00:00:00.62
17:07:11 SQL> select sum(bytes/1024/1024) M from dba_segments where segment_name = 'EMP1';
     M
----------
     4
Elapsed: 00:00:00.01
17:07:18 SQL> select status , INDEX_NAME, TABLE_NAME, LEAF_BLOCKS,BLEVEL from user_indexes;
STATUS     INDEX_NAME            TABLE_NAME         LEAF_BLOCKS BLEVEL
-------- ------------------------------ ------------------------------ ----------- ----------
UNUSABLE IND_EMP1            EMP1                    357     1
VALID     PK_EMP             EMP                       1     0
VALID     PK_DEPT            DEPT                      1     0


优点不管你是段控件 ASSM的方式 还是手工管理 都可以,缺点废掉索引。


alter table emp enable row movement;

alter table shrink space;

  

1.   create table

 

每一个 lob 类型的列,有自己独立的 segment, 可以指定也可以由系统自动生成。

另外,存储表空间也可以指定。

 

关键的一点,最好指明 disable storage in row 属性,把 lob 列的指存储到 lob 数据段, lob 字段列只存储 20 字节长的指针

 

 

LOB 字段的存储 主要分三个重要组成部分:

 

   第一是 LOB 字段列: LOB 字段列存储的是 LOB 定位符和 lob 数据

                                               (enable in row 且 lob 列小于 4KB)

 

                   LOB 定位符是一个 20 字节的指针指向 LOB 索引段,表其他列存储在表段中

                                               ( disable storage in row )

 

   第二是 LOB 索引段: LOB 索引段存储的是与 LOB 数据段对应的 Entry ,每个 Entry 对应一个 LOB 数据段的 CHUNK

 

   第三是 LOB 数据段:存储 LOB 数据

 

   注:在 oracle 10.2 版本以后 oracle 强制规定索引段和 LOB 数据段放在同一表空间,不可更改。

 

 

create tablespace tbs_lbt  -- 创建存放表的表空间

     datafile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\lbt01.DBF'

     size 10M

     extent management local --- 指定本地管理表空间

     autoallocate

     segment space management auto --ASSM 自动段空间管理

     /

 

  create tablespace tbs_lbc  -- 创建存放 lob 字段的表空间

     datafile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\lbc01.DBF'

     size 10M

     extent management local --- 指定本地管理表空间

     autoallocate

     segment space management auto --ASSM 自动段空间管理

     /

 

    注:本地管理表空间 +ASSM 自动段空间管理

 

 

  create table T_PCMS_HVPSRECV(

     origsender   VARCHAR2(14) not null,

     origsenddate VARCHAR2(8) not null,

     mesgid       VARCHAR2(20) not null,

     flag         VARCHAR2(1) not null,

     datalen      VARCHAR2(8) not null,

     incommsg1     BLOB not null,

     incommsg2     BLOB not null,

     hostid       VARCHAR2(16),

     reserve1     VARCHAR2(10),

     reserve2     VARCHAR2(20)

    )

   tablespace tbs_lbt

   LOB(incommsg1) store as seg_hvpsrecv_incommsg1 (tablespace tbs_lbc         --LOB 字段存储到 tbs_lbs 表空间

   chunk 24576  --24KB          ---lob 字段的 chunk=24kb ,由测试环境的 avg(dbms_lob.getlength(incommsg) 得到的平均值估算

   disable storage in row  ---lob 字段存储到 lob 数据段, lob 字段列 只存储 20 字节长的指针

   PCTVERSION 10  ---- 默认,

   NOCACHE LOGGING) --- 不缓存,但 longging

   LOB(incommsg2) store as seg_hvpsrecv_incommsg2 (tablespace tbs_lbc

   chunk 24576  --24KB

   disable storage in row

   PCTVERSION 10

   NOCACHE LOGGING)

   ;

 

 

SQL>  create index ind_SEG_HVPSRECV on T_PCMS_HVPSRECV (origsender);

 

索引已创建。

 

 

 

 

  注:大字段的存储属性需要特别注意

 

     chunk 的大小, chunk 的值是 oracle 数据块的整数倍,是 lob 段的最小单位,

            当 oracle 数据块的值是 8Kb 时, chunk 最大值是 32KB

 

       chunk 的大小不宜设置太大,也不宜设置太小,设置太大,浪费空间,

    设置太小会导致 lob 索引段空间不断增加,因为 lob 索引段中的 entry 数量跟 chunk 的数量是一一对应的。

 

    in row :将 lob 数据统统放到 lob 数据段,不管大小

 

     pctversion : lob 数据段的版本控制跟普通表是不同的,他不通过回滚段,而是靠存储前映像来控制的,即当 update 一个 lob 列的值时,他会重新插入到新的 chunk 中去,而保留之前的 chunk , pctversion 就是来控制保留还是重用的权重值

 

     NOCACHE LOGGING :不缓存,但 logging

 

 

2. insert 

  insert into T_PCMS_HVPSRECV values('1','2','3','4','5','22244555555555555555555555555555555555555',

'666666666666666666666666666666666667777777777777777777777777777777777','a','b','c');

 

commit;

 

3.  update

 

 

  ---update T_PCMS_BEPSRECV set incommsg1=EMPTY_BLOB() where origsenddate>=to_char(sysdate,'YYYYMMDD');

 --- 清除 lob 字段数据, lob 字段删除后,空间不会回收的,

 

4.   delete

 

  delete from T_PCMS_BEPSRECV where origsenddate>=to_char(sysdate,'YYYYMMDD');  

   ---- 清除表数据, lob 字段删除后,空间不会回收的,

 

5.  删除记录之后,进行收缩表段     , 回缩 (shrink )

 

表可收缩的原理

     随着记录的增加高水位线不断的右移,记录的删除不会导致高水位线往回 ( ) 移动

     删除记录后的空闲空间 ( 高水位线左侧 ) 尽管可以使用,但其稀疏性导致空间空闲

     注:完整的表扫描所耗费的时间不会因为记录的减少 ( 删除 ) 而减少

 

segment shrink 分为两个阶段:

1 、数据重组(compact):通过一系列insert、delete操作,将数据尽量排列在段的前面。在这个过程中需要在表上加RX锁,即只在需要移动的行上加锁。由于涉及到rowid的改变,需要enable row movement.同时要disable基于rowid的trigger.这一过程对业务影响比较小。

 2 、HWM调整:第二阶段是调整HWM位置,释放空闲数据块。此过程需要在表上加X锁,会造成表上的所有DML语句阻塞。在业务特别繁忙的系统上可能造成比较大的影响。

 

 

回缩 (shrink )

   LOB段,注,10gR2以后版本支持对LOB段的收缩,数据库的移动会造成rowid的改变,导致引用表的一些对象失效,需要重新编译。

 

  shrink 会自己维护索引,不用重建索引。

   oracle是从后向前移动行数据,那么,shrink的操作就不会像move一样,shrink不需要使用额外的空闲空间。

 

 

 

 

前提条件:

  1 、表必须启用 row movement

  2、表段所在表空间的段空间管理(segment space management)必须为auto

  3、如果你的系统使用了基于 rowid 的触发器,也应该提前设置它为 disable 状态。

 

 

 

 

1.       shrink 不能在 segment space management manaual 的表空间的段上执行

                               否则报错:

 

alter table tb_manual  shrink space

*

第 1 行出现错误 :

ORA-10635: Invalid segment or tablespace type

 

   2.  -- 直接收缩,提示必须启动 row movement 选项

SQL> alter table tb_auto shrink space;

alter table tb_auto shrink space

*

第 1 行出现错误 :

ORA-10636: ROW MOVEMENT is not enabled

 

 

 

整体过程:

 

     alter table T_PCMS_BEPSRECV enable row movement;--( 上线时执行一次即可 )

 

     alter table T_PCMS_BEPSRECV modify LOB (INCOMMSG) (shrink space);  -- 释放 LOB 字段空间

            一次只能释放一个 lob 列,可以分多次执行。

-- 注:此方法会在表空间级释放出部分空间给其他对象使用,但这部分空间在操作系统级还是被占用

 

     alter table T_PCMS_BEPSRECV shrink space;  -- 释放表的其他列的空间 降低水位线,但不释放 lob 数据空间

 

  重新编译无效对象:以 SYSDBA 用户,执行 ORACLE_HOME/rdbms/admin/utlrp.sql  脚本

 

     analyze table t_pcms_bepsrecv compute statistics;  --- 更新统计分析

 

shrink 会自己维护索引,不用重建索引。

 

SQL> select STATUS from dba_indexes where INDEX_NAME='IND_SEG_HVPSRECV';

 

STATUS

--------

VALID

 

 

 

 

5. 删除记录之后,进行   move  数据库的移动会造成rowid的改变,导致引用表的一些对象失效,需要重新编译。

  

前提条件:

  1 、表必须启用 row movement

  2、表段所在表空间的段空间管理(segment space management)必须为auto

  3、如果你的系统使用了基于 rowid 的触发器,也应该提前设置它为 disable 状态。

 

 

LOB 段可以利用 move 来重整数据,以下的语句会将表与 lob 字段 move 到指定的表空间:

   alter table table_name move [tablespace tbs_name]

lob(lob_field1,lob_field2) store as (tablespace new_tbs_name);

如果 LOB 字段在分区表中,则增加 partition 关键字,如

   alter table table_name move [partition partname] [tablespace tbs_name]

lob(field) store as (tablespace new_tbs_name);

 

 

alter table t_pcms_hvpsrecv move tablespace tbs_lbt

lob (incommsg1) store as (tablespace tbs_lbc)

lob (incommsg2) store as (tablespace tbs_lbc);       

 

move index 的状态是 UNUSABLE , 需要进行 rebuild

SQL> select STATUS from dba_indexes where INDEX_NAME='IND_SEG_HVPSRECV';

STATUS

--------

UNUSABLE

6.expdp/impdp

  delete 一部分,然后 expdp, drop table, impdp 但是需要保证 imp exp 时候 lob 字段的表或分区在的表空间名称一致。

7. truncate

   truncate table T_PCMS_HVPSRECV;-- 测试验证: truncate 表会同时释放 lob 数据段空间

 

8.drop  table T_PCMS_HVPSRECV;      ------- 删除表会同时释放 lob 数据段空间

  注意情况回收站。 purge table T_PCMS_HVPSRECV;

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

转载于:http://blog.itpub.net/29990276/viewspace-1411154/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值