LOB属性详细分析

2020-08-22 00:00:00 索引 缓存 对象 大小 空间

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 分析LOBstore 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))


 1Tablespace


LOBINDEXLOBSEGMENT存储在一个表空间中,这个表空间可以跟T表存储在不同表空间,原因1:可以单独设置LOB段表空间的存储属性,2优化I/O默认LOB不被Oracle缓存(>4000字节)。从而减少大对象访问的物理I/O影响其他数据的访问。也就是隔离大对象的物理I/0.


2enable storage in row:行内存储

如果LOB字段小于4000字节,该熟悉可以在行内存储,即在表的行记录中存储LOB数据。而不是在单独的LOB段中存储,这样就避免了每次访问LOB数据发生的物理I/O .


(3) chunk. LOB的小分配单元,由一组逻辑上连续的数据库块组成,chunk大小是Oracle块大小的整数倍。


 chunk大小要考虑2点: 1 尽量与要存储的LOB大小相差不多,因为一行的LOB要占有至少一个chunk。如果存储的LOB4K,而chunk大小为8K,则平均浪费就很多空间。

                                        2 LOB大比如(50M chunk小,则影响LOBindex的维护就会有压力。一个LOBchunk索引的存储条目就会增加。

4 Cachenocache

读写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减小LOBSGA中其他数据的冲击。

相关文章