lob字段这里通常表示Blob,Clob与Bfiles字段,但是经常情况下,我们只讨论Blob与Clob字段,以下的Blob字段就表示Blob与Clob。Blob一般用于保存2进制的数据,如图片等,Clob一般可以用于保存文字等字符信息,与数据库的字符集有密切关系。
创建带LOB字段的完整语法为:
- Create table DemoLob ( A number, B clob )
- LOB(b)
- STORE AS lobsegname (
- TABLESPACE lobsegts
- STORAGE (lobsegment storage clause)
- [CHUNK 8K disable storage in row]
- INDEX lobindexname (
- TABLESPACE lobidxts
- STORAGE ( lobindex storage clause )
- )
- )
- TABLESPACE tables_ts
- STORAGE( tables storage clause );
其中,store as (enable storage in row|disable storage in row)表示是否允许lob数据保存在行内(与其他字段数据放在表段)。对于enable storage in row,表示允许小于4000字节的lob字段信息保存在表段,是默认值,对于大于4000字节的lob字段保存在lob段(同disable storage in row),在表段将保留36-84字节的控制信息。对于disable storage in row,Oracle将lob字段分开保存在lob段中,而仅仅在行位置保留20字节的指针。对于相当于disable storage in row的这部分(也就是单独保存在LOB段的这部分数据),UNDO仅仅是记录指针与相关lob索引改变,如果发生更新操作等DML操作,原始数据将保留在LOB段。
storage as ( CHUNK bytes )表示对于disable storage in row的这部分,最小的LOB块的大小,必须是数据库块(DB_BLOCK_SIZE)的整数倍。一个chunk最多只保留一行LOB数据,也就是说,如果你设置了32K的CHUNK,但是如果LOB字段大小只有4K,也将占用32K的空间。
storage as(cache|nocahce)表示是否允许lob段经过buffer cache并缓存。默认是nocache,表示直接读与直接写,不经过数据库的data buffer。所以,默认情况下,对于单独保存在LOB段的这部分数据,在发生物理读的时候,是直接读,如direct path read (lob)
storage as(nocache logging |nocache nologging),logging/nologging属性只对nocache方式生效,默认是logging,如果是nologging方式,对于保存在行外的log部分,在update等DML操作时将不记录redo日志。
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);
lob段的信息可以从dba/all/user_lobs中获得,并可以与其它段一样,从user_segments/user_extents中获得段与区间信息。


