1

有人知道 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
4

2 回答 2

1

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

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

当存储在给定行中的 LOB 的大小很小(大约 4000 字节或更少)并且您在创建表时显式指定 ENABLE STORAGE IN ROW 或 LOB 存储子句时,或者当您未指定此参数时(是默认值)。

当 LOB 值为 NULL 时(与列的 LOB 存储属性无关)。

使用默认的 LOB 存储属性(内联存储)可以获得更好的数据库性能;它避免了为较小的 LOB 值创建和管理离线存储的开销。如果存储在数据库中的 LOB 值通常很小,则建议使用内联存储。

于 2013-06-27T19:01:02.767 回答
0

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

我们在生产中使用 SecureFile LOB 多年,我发现了如何检查单个 LOB 的块号。首先,您需要通过调用 获取 LOB 具有的范围数DBMS_LOBUTIL.GETINODE(mylob).EXTENTS,然后您可以找出每个范围内存储了多少块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    
于 2018-05-27T13:46:47.107 回答