SecureFile LOB的最小块数是多少?

时间:2013-06-27 17:08:27

标签: oracle oracle11g

有人知道SecureFile如何将LOB存储到块中吗?文档说CHUNK参数只是建议性的(http://docs.oracle.com/cd/E11882_01/appdev.112/e18294/adlob_smart.htm#CIHIDGJA)。

我做了一些初步测试,看起来Oracle每个LOB最少使用一个块(编辑:如果它存储在lobsegment中)。是吗?

CREATE TABLE sftest (mylob CLOB) 
  LOB (mylob) STORE AS SECUREFILE sftest_mylob (DISABLE STORAGE IN ROW);

INSERT INTO sftest SELECT object_name FROM all_objects;
11,825 rows inserted

SELECT blocks FROM user_segments WHERE segment_name='SFTEST_MYLOB';
14336

2 个答案:

答案 0 :(得分:1)

实际上,每个LOB最少一个块是不正确的。它可以小得多,具体取决于您的LOB的大小。来自Oracle docs

  

当满足以下任何条件时,LOB值将内联存储   适用:

     

当存储在给定行中的LOB的大小很小时,大约4000字节或更少,并且您要么明确指定   创建时,启用ROW或LOB存储子句中的存储   表,或者当你没有指定这个参数时(这是   默认值)。

     

当LOB值为NULL时(无论LOB存储属性如何)   对于专栏)。

     

使用默认的LOB存储属性(内联存储)可以允许   为了更好的数据库性能它避免了创建的开销   并管理较小LOB值的外部存储。如果LOB值   存储在数据库中的数量通常很小,然后使用   建议使用内联存储。

答案 1 :(得分:0)

是的,SecureFile LOB的最小块数为1(如果它没有存储在行中)。

我们在生产中使用SecureFile LOB多年,我发现了如何检查单个LOB的块编号。首先,您需要通过调用DBMS_LOBUTIL.GETINODE(mylob).EXTENTS来获取LOB所具有的范围数,然后您可以找到每个范围,使用DBMS_LOBUTIL.GETLOBMAP(mylob, myextent).NBLKS存储的块数,例如

SELECT DBMS_LOBUTIL.GETINODE(mylob).LENGTH    AS len,
       DBMS_LOBUTIL.GETINODE(mylob).EXTENTS   AS extents,
       DBMS_LOBUTIL.GETLOBMAP(mylob, 0).NBLKS AS nblks           
  FROM sftest;

LEN  EXTENTS NBLKS
 34        1     1
 24        1     1
 42        1     1