Oracle SecureFile LOB的最小块数是多少?

Oracle SecureFile LOB的最小块数是多少?,oracle,oracle11g,Oracle,Oracle11g,有人知道SecureFile如何将LOB存储成块吗?文档中说CHUNK参数只是建议() 我做了一些初始测试,看起来Oracle每个LOB至少使用一个块(编辑:如果存储在LOB段中)。是这样吗 CREATE TABLE sftest (mylob CLOB) LOB (mylob) STORE AS SECUREFILE sftest_mylob (DISABLE STORAGE IN ROW); INSERT INTO sftest SELECT object_name FROM all

有人知道SecureFile如何将LOB存储成块吗?文档中说
CHUNK
参数只是建议()

我做了一些初始测试,看起来Oracle每个LOB至少使用一个块(编辑:如果存储在LOB段中)。是这样吗

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

实际上,每个LOB至少有一个块是不正确的。它可以小得多,这取决于LOB的大小。从

当出现以下任一情况时,LOB值将以内联方式存储 适用于:

当存储在给定行中的LOB的大小很小(大约4000字节或更小)时,您可以显式指定 在创建 表,或者在未指定此参数(即 默认值)

当LOB值为NULL时(无论LOB存储属性如何 用于列)

使用默认LOB存储属性(内联存储)可以允许 提高数据库性能;它避免了创建的开销 以及为较小的LOB值管理离线存储。If LOB值 存储在数据库中的数据通常较小,然后使用 建议使用内联存储


实际上,每个LOB至少有一个块是不正确的。它可以小得多,这取决于LOB的大小。从

当出现以下任一情况时,LOB值将以内联方式存储 适用于:

当存储在给定行中的LOB的大小很小(大约4000字节或更小)时,您可以显式指定 在创建 表,或者在未指定此参数(即 默认值)

当LOB值为NULL时(无论LOB存储属性如何 用于列)

使用默认LOB存储属性(内联存储)可以允许 提高数据库性能;它避免了创建的开销 以及为较小的LOB值管理离线存储。If LOB值 存储在数据库中的数据通常较小,然后使用 建议使用内联存储


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

我们在生产中使用SecureFile LOB已有多年,我发现了如何检查单个LOB的块编号。首先,您需要通过调用
DBMS\u lobuutil.GETINODE(mylob).extents
,来获取LOB拥有的扩展数据块的数量,然后您可以找到每个扩展数据块存储在
DBMS\u lobuutil.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    

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

我们在生产中使用SecureFile LOB已有多年,我发现了如何检查单个LOB的块编号。首先,您需要通过调用
DBMS\u lobuutil.GETINODE(mylob).extents
,来获取LOB拥有的扩展数据块的数量,然后您可以找到每个扩展数据块存储在
DBMS\u lobuutil.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    

每行中至少不存储一个LOB块。块大小是一个或多个数据库块。如果将数据库块的大小设置为较小,并且块的大小设置为多个数据库块,则这只会产生影响。然后LOB将最少占用一个以上的数据库块。@Brian这听起来很像
BASICFILE
,所以存储是相同的?只是没有文档说明SECUREFILE总是使用一个数据库块-只是它忽略块大小,并做自己的事情。可以尝试使用块大小为2k的数据库,并查看是否每个LOB使用一个或多个块,而不是存储在行最小值中。@Brian,那么,这是什么呢?每个LOB至少有一个块不存储在行中。块大小是一个或多个数据库块。如果将数据库块的大小设置为较小,并且块的大小设置为多个数据库块,则这只会产生影响。然后LOB将最少占用一个以上的数据库块。@Brian这听起来很像
BASICFILE
,所以存储是相同的?只是没有文档说明SECUREFILE总是使用一个数据库块-只是它忽略块大小,并做自己的事情。您可以尝试使用块大小为2k的数据库,看看每个LOB是否使用一个或多个块,而不是存储在行最小值中。@Brian,这是自己的事情吗?很抱歉,问题的措辞不够清晰:我只对LOB段感兴趣。我假设
行中的存储
对于
基本文件
安全文件
来说是一样的。如果它的存储不一致,我相信最小值取决于LOB所在的表空间块大小。我担心这个问题的措辞不够清晰:我只对LOB段感兴趣。我假设
行中的存储
对于
基本文件
安全文件
来说是一样的。如果其存储不一致,我认为最小值取决于LOB所在的表空间块大小