lob类型的存放

大对象数据类型blob clob nclob 和bfile能以二进制或字符格式存放和操纵非结构化的大数据块。他们提供了有效的,随机的,精确地访问。oracle推荐使用lob数据类型而不是long数据类型。可以再bob列上执行并行查询,但是不能并行dml或ddl。lob数据类型与long raw数据类型有下面几个不同之处:
1一个表可以包含多个lob列,但是只能有一个long列。
2一个包含一个或多个lob列的表可以分区,但是一个包含long列的表不能被分区。
3lob最大的尺寸是8 terabytes,而long最大的尺寸是2 gigabytes。
4lob支持随机访问数据,long只支持顺序访问
5lob数据类型可以使用户定义类型的一个属性,但是long不能
6临时的lob能像本地变量一样在lob数据上执行转换。临时内部lobs在临时表空间创建,与表相独立。long的没有临时结构可用。
7lob的列可以被replicated,但是long类型的不能。
在表上定义lob,可以明确的为每个lob指定表空间和存储特性。lob数据类型可以存放在表内,表外(使用lob 定位器)或是一个外部表。


lob数据类型
blob数据存放了非结构的二进制数据。clob和nclob数据类型存放的是字符数据,clob存放数据库字符集数据,nclobs存放unicode国家字符集数据,都可以存放8 terabytes。使用dbms_lob包来改变blob值。blob定位器不能跨越事务和会话。
bfile数据类型
bfile数据类型存放非结构化二进制数据在数据库之外的操作系统文件中。一个bfile列或属性存放了一个文件定位器来指向包含数据的外部文件。bfile可以存放8 terabytes大小数据。bfile是只读的,你不能修改他们。他们只支持随机读,底层的操作系统必须维护文件的一致,安全,和持久性。管理员要确保文件存在,oracle进程有操作系统读取文件的权限。
lob 定位器
一个lob实例有一个定位器和值。定位器是指向lob值物理存放的指针。
在下面的情况下lob值是在表外存放的:
1默认的,如果在创建表的时候你不指定lob的存储参数。
2当在创建表的时候明确的指定了disable storage in row
3当lob的大小超过了3964字节
4如果在更新了在表外lob后,lob小于3964字节,那么lob仍然是在表外放置的。
当下面的条件应用的时候,lob是在表内的
1当明确指定了enable storage in row,并且lob的值很小,4k或更小。
2当lob的值是null
使用内联的lob能有好的性能,避免了创建和管理的额外开销,如果存放的lob值很小,oracle建议使用内联的lob.
下面是一个表定义:
CREATE TABLE ContainsLOB_tab (n NUMBER, c CLOB)  
      lob (c) STORE AS SEGNAME (TABLESPACE lobtbs1 CHUNK 4096 
                        PCTVERSION 5 
                        NOCACHE LOGGING 
                        STORAGE (MAXEXTENTS 5) 
                       ); 
lob存储属性包含下面几点:
TABLESPACE
PCTVERSION or RETENTION
Note that you can specify either PCTVERSION or RETENTION, but not both.
CACHE/NOCACHE/CACHE READS
LOGGING/NOLOGGING
CHUNK
ENABLE/DISABLE STORAGE IN ROW
STORAGE


PCTVERSION
 当一个lob被修改,一个lob页的新版本产生了,用来支持前版本的一致性读。
pctversion是能被旧的lob页占用的空间百分比,旧页占用空间超过pctversion的数量,oracle试着回收旧版本重用空间,PCTVERSION就是存放旧数据的空间百分比。
PCTVERSION有默认值是10%,最小0 最大100
为了决定她的大小,考虑下面的条件:
How often LOBs are updated?
How often the updated LOBs are read?
表推荐




RETENTION
作为pctversion的替代,可以指定retention参数。这个参数指明旧版本存放的时间而不是空间百分比。存放的时间是UNDO_RETENTION这个参数的值。
 CREATE TABLE ContainsLOB_tab (n NUMBER, c CLOB)  
      lob (c) STORE AS SEGNAME (TABLESPACE lobtbs1 CHUNK 4096 
                        RETENTION 
                        NOCACHE LOGGING 
                        STORAGE (MAXEXTENTS 5) 
                       ); 


CACHE / NOCACHE / CACHE READS
CACHE: oracle放lob页到buffer cache中为了更快的访问。
NOCACHE:作为as语句的参数,nocache指明了lob值不被带到buffer cache中。
CACHE READS:lob的值只是在读取的时候放到buffer cache,在写的时候不放进去。




CHUNK
chunk是一个或多个oracle块,在创建表时可以指定lob的chunk大小,当访问或是改变lob值时候就是chunk的大小,部分的chunk用来存放系统相关的信息和存放lob数据。可以用pl/sql的dbms_lob.getchunksize来获取chunk中使用的空间。
选择CHUNK的值
一旦chunk的值选定了,就不能再修改,
设置inital和next大于chunk
如果你明确指定lob的存放属性,确保inital和next大于chunk,比如如果数据库的块是2KB,你指定chunk是8KB,那么确保inital和next大于8KB,比如16KB
Put another way: If you specify a value for INITIAL, NEXT, or the LOB CHUNK size, then make sure they are set in the following manner:
CHUNK <= NEXT
CHUNK <= INITIAL
 


ENABLE or DISABLE STORAGE IN ROW Clause
 
使用ENABLE | DISABLE STORAGE IN ROW语句来说明lob是存放在表内还是表外,默认是放在表内。


ENABLE or DISABLE STORAGE IN ROW的指导
在行中最大的lob数据存放时varchar2的最大值(4000),包含控制信息和lob的值,要是指明lob存放在行内,一旦lob的值和控制信息大于4000,那么lob值自动移动到行外
建议如下:
The default, ENABLE STORAGE IN ROW, is usually the best choice for the following reasons:
默认的放到行内通常有下面的原因:
小lobs,如果lob小于4000字节,那么lob的读取就不用额外的io
大lobs,如果lob大于4000字节,那么控制信息仍然放到行内,即使移动lob数据到行外,这个控制信息能让我们读取行外的数据更快。
然而,一些情况下放在行外是更好的选择,这是因为放到行内增加了行的大小,在处理表的时候会有影响,比如全表扫,范围扫,或是update/select不含lob的列。

你可能感兴趣的:(lob存放)