LOB 类型的讨论
1 创建表t , 有两个大对象类型
create table t (id int primary key,
image blob,
txt clob)
segment creation immediate
lob(txt) store as securefile
lob(image) store as securefile
/
SecureFile 支持加密、压缩和去重,但是这些LOB特性,需要买选项或压缩选项。
2 查看表定义,注意大对象的定义以及参数设置特点
SCOTT@prod> select dbms_metadata.get_ddl('TABLE','T') from dual;
DBMS_METADATA.GET_DDL('TABLE','T')
--------------------------------------------------------------------------------
CREATE TABLE "SCOTT"."T"
( "ID" NUMBER(*,0),
"IMAGE" BLOB,
"TXT" CLOB,
PRIMARY KEY ("ID")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS" ENABLE
) SEGMENT CREATION IMMEDIATE
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS"
LOB ("IMAGE") STORE AS SECUREFILE (
TABLESPACE "USERS" ENABLE STORAGE IN ROW CHUNK 8192
NOCACHE LOGGING NOCOMPRESS KEEP_DUPLICATES
STORAGE(INITIAL 106496 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT))
LOB ("TXT") STORE AS SECUREFILE (
TABLESPACE "USERS" ENABLE STORAGE IN ROW CHUNK 8192
NOCACHE LOGGING NOCOMPRESS KEEP_DUPLICATES
STORAGE(INITIAL 106496 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT))
LOB相关的几个选项
# tablespace - - - lob 段存储的表空间
# enable storage in row - - - 默认属性
# chunk 8192
# nocache - - - BasicFile
3 查看表T的定义,看含LOB段的表的创建,带来哪些新对象
SCOTT@prod> select segment_name,segment_type from user_segments;
SEGMENT_NAME SEGMENT_TYPE
--------------------------------------------------------------------------------- ------------------
DEPT TABLE
EMP TABLE
EMP_HASH TABLE PARTITION
EMP_HASH TABLE PARTITION
PK_DEPT INDEX
PK_EMP INDEX
SALGRADE TABLE
SYS_C0011091 INDEX
SYS_IL0000087380C00002$$ LOBINDEX
SYS_IL0000087380C00003$$ LOBINDEX
SYS_LOB0000087380C00002$$ LOBSEGMENT
SYS_LOB0000087380C00003$$ LOBSEGMENT
T TABLE
13 rows selected.
T表的创建,带来5个段,SYS_#####,这里SYS_C0011091 为主键对应的索引。其他为关于LOB对象的索引和LOB段。
也就是在T 表的LOB字段位置放的是索引指针,通过索引找到LOB段。这个搜索是很快地(索引的二叉树结构,索引找数据的方式决定)
4 分析LOB的store as后面的存储属性
LOB ("TXT") STORE AS SECUREFILE (
TABLESPACE "USERS" ENABLE STORAGE IN ROW CHUNK 8192
NOCACHE LOGGING NOCOMPRESS KEEP_DUPLICATES
STORAGE(INITIAL 106496 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT))
(1)Tablespace:
LOBINDEX,LOBSEGMENT存储在一个表空间中,这个表空间可以跟T表存储在不同表空间,原因1:可以单独设置LOB段表空间的存储属性,2优化I/O默认LOB不被Oracle缓存(>4000字节)。从而减少大对象访问的物理I/O影响其他数据的访问。也就是隔离大对象的物理I/0.
(2)enable storage in row:行内存储
如果LOB字段小于4000字节,该熟悉可以在行内存储,即在表的行记录中存储LOB数据。而不是在单独的LOB段中存储,这样就避免了每次访问LOB数据发生的物理I/O .
(3) chunk. LOB的小分配单元,由一组逻辑上连续的数据库块组成,chunk大小是Oracle块大小的整数倍。
chunk大小要考虑2点: 1 尽量与要存储的LOB大小相差不多,因为一行的LOB要占有至少一个chunk。如果存储的LOB有4K,而chunk大小为8K,则平均浪费就很多空间。
2 LOB大比如(50M) 而chunk小,则影响LOBindex的维护就会有压力。一个LOB的chunk索引的存储条目就会增加。
(4) Cache和nocache
读写LOB时是否缓存LOB。
alter table t modify lob(image) (cache);
alter table t modify lob(txt) (nocache);
nocache: 不缓存
cache reads: 读缓存,写不缓存
cache :读写都缓存。
(5) buffer_pool : 默认将读出的LOB放入SGA的那块内存结构,可以修改为keep池或者recycle池,可以j减小LOB对SGA中其他数据的冲击。