Enable/Disable行内存贮的LOB字段性能分析

    定义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     7989

1 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 processed

SQL> 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索引的访问, 有助于提高性能.

留言 (4)

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了, 所以肯定也是存放在行外的, 就算这样, 在存贮上也有区别的.

发表留言:

« Previous | Main | Next »

英语900句 | English 900

  • Do you often go to a concert?
  • 你经常去听音乐会吗?
  • I hate Jazz. It's too noisy.
  • 我讨厌爵士, 太吵了.
  • Do you like pop music?
  • 你喜欢流行音乐吗?
  • I have never heard the piece before, who wrote it?
  • 我从没听过这首曲子, 谁写的?
  • What do you think of their skill?
  • 你觉得他们演奏技术如何?