LOB字段管理--LOB MOVE

今天进行了LOB数据的移植工作,先前LOB和其他的数据存储在一个表空间中,
随着开发人员业务的变化和目前数据容量的持续增加现在考虑将LOB字段的数据
移植到一个单独的表空间。
在移植看注意研究了下ORACLE ALTER TABLE MOVE 的语法:

ALTER TABLE table_name MOVE [ONLINE] tablespace_name;
通过上面的语句可以移植表到新表空间,如果要移植LOB字典需要参考以下语法:
ALTER ABLE table_name LOB (lob_item) STORE AS [lob_segment]
(
TABLESPACE tablespace_name
(STORAGE.....)
ENABLE|DISABLE STORAGE IN ROW
CHUNK integer
PCTVERSION integer
RETENTION
FREEPOOLS integer
CACHE|NOCACHE|CACHE READS
INDEX lobindexname (TABLESPACE tablesapce_name ((STORAGE.....))
)

....

[@more@]

这里面有很多的项
LOB (lob_item):表中的lob字段
STORE AS [lob_segment]:每个lob字段在表创建后系统都会自动单独创建一个段,可以通过这个参数手动指定一个段名
tablespace_name:LOB字段新的存储表空间
(STORAGE.....):指定tablespace_name的存储属性
ENABLE STORAGE IN ROW:如果设置了enable storage in row 那么oracle会自动将小于4000bytes的数据存储在行内,
这是ORACLE的默认值
DISABLE STORAGE IN ROW:如果DISABLE这个属性,那么lob数据会在行外存储,行内只存储该lob值得指针,而且这个属性在表
创建后只能在MOVE表时才可以被改变
CHUNK:是一个很特别的属性,对一次LOB数据的操作(插入或更新),因该分配多少存储空间,指定的值最好是数据库块的倍数,而且
指定的值不能大于表空间区间中NEXT的值, 要不然ORACLE会return一个错误,如果以前已经设置这个值了,那么在后期指定的值
是不能被改变的
PCTVERSION integer、RETENTION:都是ORACLE用来管理LOB字段镜像数据的。在LOB 数据的更新过程中,
ORACLE没有用UNDO TABLESPACE空间,而是从LOB字段所在的表空间里划分一段空间来做镜像空间的,
这个空间的大小由PCTVERSION参数控制,默认值为10,代表划分表空间的10%作为镜像空间,
每个镜像空间的单元大小由CHUNK参数指定,pctversion可以使用在manual undo mode和automatic undo mode 环境中.
retention应用了automatic undo mode中的undo_retention通过时间来管理lob镜像空间.
pctversion和retention不能同时被指定.建议数据库在automatic undo mode下使用retention参数。
FREEPOOLS integer:给LOG segment指定free list.RAC环境下integer为实例的个数.单实例环境下为1.在automatic undo mode下oracle默认采用
FREEPOOLS来管理空闲块列表。除非我们在表的storage配置中指定了freelist groups参数.
CACHE|NOCACHE|CACHE READS:指定lob块是否在database buffer中缓存.
INDEX lobindexname (TABLESPACE tablesapce_name ((STORAGE.....):给lob列指定索引存储参数
举例:
SQL> show parameter db_create_file_dest

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_create_file_dest

SQL>
create tablespace test datafile size 100M autoextend off;
SQL> Tablespace created.

SQL> create table test(a varchar2(100), b clob, d blob) pctfree 10 tablespace test;

Table created.
SQL> desc test
Name Null? Type
----------------------------------------- -------- ----------------------------
A VARCHAR2(100)
B CLOB
D BLOB

SQL> SELECT segment_name,tablespace_name,segment_type FROM dba_segments WHERE tablespace_name='TEST';

SEGMENT_NAME TABLESPACE_NAME SEGMENT_TYPE
------------------------------ ------------------------------ ------------------
TEST TEST TABLE
SYS_IL0000054526C00002$$ TEST LOBINDEX
SYS_IL0000054526C00003$$ TEST LOBINDEX
SYS_LOB0000054526C00002$$ TEST LOBSEGMENT
SYS_LOB0000054526C00003$$ TEST LOBSEGMENT
我们发现每个LOB字段单独有一个LOGSEGMENT和LOBINDEX;SQL> set linesize 200
col table_name format a5
col column_name format a5
SELECT b.table_name,
a.segment_name,
b.index_name,
a.segment_type,
b.column_name,
a.tablespace_name,
b.chunk,
b.cache,
b.freepools,
b.pctversion,
b.retention
FROM dba_segments a,dba_lobs b
WHERE a.segment_name = b.segment_name
AND a.tablespace_name = 'TEST'
/SQL> SQL> SQL> 2 3 4 5 6 7 8 9 10 11 12 13 14 15

TABLE SEGMENT_NAME INDEX_NAME SEGMENT_TYPE COLUM TABLE CHUNK CACHE FREEPOOLS PCTVERSION RETENTION
----- ------------------------------ ------------------------------ ------------------ ----- ----- ---------- ---------- ---------- ---------- ----------
TEST SYS_LOB0000054526C00002$$ SYS_IL0000054526C00002$$ LOBSEGMENT B TEST 8192 NO 10 900
TEST SYS_LOB0000054526C00003$$ SYS_IL0000054526C00003$$ LOBSEGMENT D TEST 8192 NO 10 900

从上面的结果我们可以观察到LOB字段的各个属性.
下面我们对LOB字段move到另一个表空间

SQL> create tablespace lob_test datafile size 100M autoextend off;

Tablespace created.

SQL> ALTER TABLE TEST MOVE LOB(B) STORE AS TEST_B (
TABLESPACE lob_test
DISABLE STORAGE IN ROW
CHUNK 16384
RETENTION
FREEPOOLS 1
NOCACHE);
SQL> Table altered.

SQL> ALTER TABLE TEST MOVE LOB(D) STORE AS TEST_D (
TABLESPACE lob_test
DISABLE STORAGE IN ROW
CHUNK 16384
RETENTION
FREEPOOLS 1
NOCACHE);
SQL> Table altered.

SQL> SELECT segment_name,tablespace_name,segment_type FROM dba_segments WHERE tablespace_name='TEST';

SEGMENT_NAME TABLE SEGMENT_TYPE
------------------------------ ----- ------------------
TEST TEST TABLE


SQL> set linesize 200
col table_name format a5
col column_name format a5
SELECT b.table_name,
a.segment_name,
b.index_name,
a.segment_type,
b.column_name,
a.tablespace_name,
b.chunk,
b.cache,
b.freepools,
b.pctversion,
b.retention
FROM dba_segments a,dba_lobs b
WHERE a.segment_name = b.segment_name
AND a.tablespace_name = 'LOB_TEST'
/SQL> SQL> SQL> 2 3 4 5 6 7 8 9 10 11 12 13 14 15

TABLE SEGMENT_NAME INDEX_NAME SEGMENT_TYPE COLUM TABLE CHUNK CACHE FREEPOOLS PCTVERSION RETENTION
----- ------------------------------ ------------------------------ ------------------ ----- ----- ---------- ---------- ---------- ---------- ----------
TEST TEST_B SYS_IL0000054526C00002$$ LOBSEGMENT B LOB_T 16384 NO 1 10 900
EST


TEST TEST_D SYS_IL0000054526C00003$$ LOBSEGMENT D LOB_T 16384 NO 1 10 900
EST
我们发现LOB字段B、D已经成功移植到lob_test表空间了

在一些复杂情况下可能需要连表一起移植
alter table table_name move [tablespace_name] lob (lob_item) store as [lobsegmentname] (tablespace tablespace_name.....);
移植分区中lob
alter table table_name move partition [partition_name] lob (lob_item) store as [logsegmentname] (tablespace_name.....);
移植分区表
alter table table_name move partition [partition_name] tablespace_name lob (lob_item) store as [logsegmentname] (tablespace_name.....);
如果不需要修改lobsegmentname,可以同时移植多个列
alter table table_name move lob (lob_item1,lob_item2,lob_item3...) store as [lobsegmentname] (tablespace tablespace_name.....);

在数据库中合理的存储LOB列,不仅可以提升性能,而且还可以有效的管理存储空间.

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

转载于:http://blog.itpub.net/129805/viewspace-927890/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值