表里只存储了一个指针,指向LOB的存储位置。而具体到存储,还分为lobindex,和lobsegment。表中的LOB实际上是指向lobindex, 而lobindex再指向LOB本身的各个部分。为了得到LOB中的N~M字节,要使用表中的指针(LOB定位器)解除引用,遍历lobindex来找到所需的数据库(chunk), 然后按顺序访问。这使得随机访问LOB的任何部分都同样迅速,你可以用同样快的速度来得到LOB的最前面,中间或者最后面的部分而无需再从头遍历LOB。
LOB的存储可以指定存储方式:
CREATE TABLE "SCOTT"."TEST_CLOB2"
(
"A" CLOB
) SEGMENT CREATION DEFERRED
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
TABLESPACE "USERS"
LOB ("A") STORE AS BASICFILE (
TABLESPACE "USERS"
DISABLE STORAGE IN ROW CHUNK 8192 RETENTION
NOCACHE LOGGING ) ;
TOM Kyte:
默认行为是启用行内存储(ENABLE STORAGE IN ROW),而且一般来讲,如果你知道LOB 总是能
在表本身中放下,就应该采用这种默认行为。例如,你的应用可能有一个某种类型的DESCRIPTION 字段。
这个DESCRIPTION 可以存储0~32KB 的数据(或者可能更多,但大多数情况下都少于或等于32KB)。
已知很多描述都很简短,只有几百个字符。如果把它们单独存储,并在每次获取时都通过索引来访问,就
会存在很大的开销,你完全可以将它们内联存储,即放在表本身中,这就能避免单独存储的开销。不仅如
此,如果LOB 还能避免获取LOB 时所需的物理I/O。
create table test_clob(a clob);
declare
v_result varchar2(4000);
begin
v_result := dbms_metadata.get_ddl(object_type => 'TABLE',name => 'TEST_CLOB');
dbms_output.put_line(v_result);
end;
CREATE TABLE "SCOTT"."TEST_CLOB"
(
"A" CLOB
) SEGMENT CREATION DEFERRED
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
TABLESPACE "USERS"
LOB ("A") STORE AS BASICFILE (
TABLESPACE "USERS" ENABLE STORAGE IN ROW CHUNK 8192 RETENTION
NOCACHE LOGGING )
另外, LOB的一致读的实现方式与其他数据类型是不一样的:
LOB的一致读映像来自于LOB段本身,而不是undo段。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8520577/viewspace-769067/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/8520577/viewspace-769067/