文章目录
1.LOB表创建语句
先来看一下创建lob的语句,默认的创建一个tlob表后,其实际完全sql如下:
CREATE TABLE "DSG"."TLOB"
( "ID" NUMBER(*,0),
"C_LOB" CLOB,
"B_LOB" BLOB
) SEGMENT CREATION DEFERRED
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
NOCOMPRESS LOGGING
TABLESPACE "USERS"
LOB ("C_LOB") STORE AS BASICFILE (
TABLESPACE "USERS" ENABLE STORAGE IN ROW CHUNK 8192 RETENTION
NOCACHE LOGGING )
LOB ("B_LOB") STORE AS BASICFILE (
TABLESPACE "USERS" ENABLE STORAGE IN ROW CHUNK 8192 RETENTION
NOCACHE LOGGING )
2.常见优化方法
- 设置chunk size
chunksize是oracle 块大小的整数倍.最大为32k.如果经常保存大的lob可以将此chunsize调大,否则会浪费lob空间 - cache选项
cache选项告诉oracle对于lob数据是否存放到缓存中,如果存放到缓存中,则在读写的时候为db file sequential reads.如果不设置cache,则使用直接路径读写.默认为不打开cache. - logging
是否写日志.
3.basicfile和securefile lob
默认为basicfile,经过测试securefile比basicfile性能更好
1)创建securefile lob
SQL> create table tlob2(id int,b_lob blob) LOB("B_LOB") STORE AS securefile;
2)将basicfile转换为securefile lob
alter table tlob move lob("b_lob") store as securefile (tablespace xxx);
注意:这里会move lob段,会进行锁表,如果lob很大会占用大量临时空间,而且会导致长时间锁表,
因此,最好在设计之初就将表设计为securefile lob
4.PCTFREE对lob的影响
pctfree这个参数定义了一个块保留空间的百分比,保留空间是为了将来可能发生的更新操作,因为更新可能增大被更新行占用的空间,如果此时该块没有可利用空间,那么只有发生row migrate了,从而会降低I/O性能。换句话说,就是当一个块的利用率达到1-pctfree的时候,oracle就将该块从freelist中移除,不再向该块插入数据。所以说pctfree是控制什么时候将块从freelist中移除的。
因此对于永远或者几乎不进行update的lob表,可以将pctreee设置为0
注意:建议在11.2.0.3以后再使用securefile lob,否则可能遇到一些严重的bug.