« Enable/Disable行内存贮的LOB字段性能分析 »
Oracle » http://www.anysql.net/oracle/lob_inout_row.html 2007-03-07定义LOB字段时可以加上ENABLE/DISABLE STORAGE IN ROW的存贮属性, 默认情况下是ENABLE STORAGE IN ROW的, 这种情况除了在值小于4000字节时会将值直接存在行内以提高性能外, 对于再大一点的LOB值的存取也是有性能影响的, 请看下面的在10g版本中做的测试例子, 先建一个表, 包括两个CLOB字段, 并插入一样一样的大于4000字节的值.
SQL> create table t_lobtest (col1 clob, col2 clob)
2 lob (col2) store as (disable storage in row);Table created.
ASQL> SELECT DBMS_LOB.GETLENGTH(COL1) COL1_LEN,
2 DBMS_LOB.GETLENGTH(COL2) COL2_LEN
3 FROM T_LOBTEST;COL1_LEN COL2_LEN
——– ——–
7989 79891 rows returned.
这两个字段的内容都是一致的, 并有长度大于4000个字节, 因此真正的值都是存放在行外的, 但是我们去看一下查询这两个不同字段的SQL的跟踪信息的话, 会发现所需要的逻辑读是不一样的.
SQL> select col1 from t_lobtest;
Statistics
———————————————————-
0 recursive calls
0 db block gets
11 consistent gets
4 physical reads
0 redo size
1213 bytes sent via SQL*Net to client
829 bytes received via SQL*Net from client
5 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processedSQL> select col2 from t_lobtest;
Statistics
———————————————————-
0 recursive calls
0 db block gets
19 consistent gets
4 physical reads
0 redo size
1141 bytes sent via SQL*Net to client
781 bytes received via SQL*Net from client
5 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
可以发现Physical Read都是一样的, 这是由于Direct Path Read (LOB)引起的, 但在逻辑读上, DISABLE STORAGE IN ROW的LOB例就要高出很多了, 根据我前段时间对于LOB类型值的存贮格式研究, 在ENABLE STORAGE IN ROW时, LOB的前12个CHUNK的地址会放在行内, 这十二个CHUNK的地址不会存放在LOB索引中, 相当于在行内存放了LOB_ID, CHUNK1, CHUNK2, …, CHUNK12, 而在DISABLE STORAGE IN ROW的LOB列上, 行内只存放了一个LOB_ID, 而每一个CHUNK的地址都存放在LOB索引中. 在这个例子中, CHUNK的数量为两个, 查询COL1时不需要去访问LOB索引, 而查询COL2时需要去查询LOB索引.
当去频繁地查询LOB字段内容时, 这些COST还是值得考虑的, 定义适当的CHUNK大小, 将LOB CHUNK控制在12个以内, 尽最大程度地减少LOB索引的访问, 有助于提高性能.
Tags: Index, LOB, Oracle, Tuning


12个CHUNK的地址 IN ROW,你都给解译出来了,Oracle Document LOB datatype user guide 有没有讲?
Great~
i am confused, i think the chunk should not impact in -line lobs.
IN-LINE的LOB只能存放小于3964个字节(肯定不能大于4000)的值吧, 在这个例子中, 两个字段的值已经有7K了, 所以肯定也是存放在行外的, 就算这样, 在存贮上也有区别的.