2011年7月16日土曜日

[数据类型] LOB

- clob
存储大量纯文本信息,查询时从数据库到客户端的字符集转换,修改时从客户端到数据库字符集的转换

- nclob
利用国家字符集

- blob
二进制信息,不做字符集转换

- bfile
只存储指向OS文件的指针,文件为只读访问
---------------------------------------------------------------------------------------
- 内部LOB
-- 创建带有LOB列的表
go@DEMO> create table t (id number primary key,txt clob) tablespace users;

Table created.

go@DEMO> select segment_name,segment_type,tablespace_name from user_segments;

SEGMENT_NAME               SEGMENT_TYPE    TABLESPACE_NAME
---------------                   ---------------     ---------------
T                          TABLE           USERS  --- LOB列存储的是指向lobindex的指针
SYS_LOB0000046052C00002$$  LOBSEGMENT      USERS  --- 实际的LOB列内容存在在这里(也可能直接存在表T中)
SYS_IL0000046052C00002$$   LOBINDEX        USERS  --- 对LOB内容的导航(对应每个LOB字段的多个部分chunk)
SYS_C003311                INDEX           USERS

4 rows selected.

-- tablespace
可以将LOB列提供专门的存储表空间

-- in row
--- enable storage in row --- 默认,小于4000字节的内容存储在表T中,大于4000字节则被移到lobsegment
--- disable storage in row --- log列内容总是存在lobsegment中

-- chunk
--- chunk包含n个逻辑上连续的block,是lob列分配的最小单位,lobindex指向chunk
--- 1个lob列对应至少1个chunk,1个chunk与1个lobindex条目对应,chunk越多对应的lobindex就越多
--- 要选择一个能浪费最少,又能高效存储的chunk大小

-- pctversion
--- 控制由于lob数据版本所占用的空间
--- lobsegment不使用undo,在本身维护版本信息,lobindex会产生undo
--- 修改lob时会创建新chunk,保留原来的chunk,如果会回滚事物,lobindex会回滚重新指向原来的chunk
--- 遇到ora-22924,执行sql,并增加lobsegment中为实现lob版本化所用的空间大小
alter table t modify lob(txt) (pctversion 15);

-- retention
--- 不能单独设置,只能从undo_retention来继承,功能与undo_retention一样

-- cache --- 允许lob的读写都缓存
--- nocache --- 不缓存,每次操作都是物理读写
--- cache reads --- 缓存读,但写还是物理写
--- 缓存是可以从分利用keep池或recycle池,不要将lob的缓存与常规缓存放一起,可以在sga中利用buffer_pool设置
--- 打开和关闭缓存
alter table t modify lob(txt) (cache);
alter table t modify lob(txt) (nocache);

-- log storage
--- 对于表T的设置同样适用与lobsegment和logindex
---------------------------------------------------------------------------------------
- 外部LOB(bfile)

-- 内置包utl_file没有使用bfile
-- 必须使用directory对象
-- bfile列的大小就是目录加文件名的大小
-- bfile所指向的OS文件只读,不能对文件进行commit和rollback等操作
-- bfile列内容(指向的文件名)可以修改

-- 插入bfile数据
insert into t values (bfilename('DATA_PUMP_DIR','tts.dmp')); --- 目录路径要使用大写

-- 查询文件大小
select dbms_lob.getlength(a) from t;

0 件のコメント:

コメントを投稿