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