设置
我有一个 oracle 表,它有几个属性和 CLOB 数据类型。下表是我用两种方式创建的,每种方式都应该给出相同的行为。
CREATE TABLE DEMO(
a number (10, 2),
data CLOB
)
CREATE TABLE DEMO(
a number (10, 2),
data CLOB
) LOB (data) Stored AS (STORAGE IN ROW ENABLED)
场景
根据 oracle 文档,当 CLOB 大于 4000 字节时,它将以轮廓方式存储,否则以内联方式存储。
当我在该表中存储一个 clob 值的数据时,说“Hello”,然后我看到“演示表”和“演示表 LOB 段”的段信息,它表明所有数据都是进入表,并且 Lob 段中没有消耗新 block 。
当我存储总字符数小于 1500 的较大数据时,我也会得到与上面相同的行为。
但是,当我存储总字符数 > 2000 且 < 3000 的数据时,即使总字符数小于 3000,LOB 数据也会进入 LOB 段。
问题
- 为什么小于 3000 个字符的数据会进入 LOB 段? 。每个字符占用 2 个字节,这证明直到 1500 为止的数据都将进入数据而不是日志段。
问题
由于 LOB 表,大量磁盘空间被浪费,因为 CHUNK 大小为 8kb,并且每个 block 的数据始终约为 3 - 4K 字符,并且在某些情况下超过该值。因此,对于每行来说,浪费了 4Kb 空间,在 2000 万行的情况下,它的运行需要 50 GB
最佳答案
这可以解释上述行为..
“CLOB 和 NCLOB 数据类型在数据库中存储最多 4 GB 的字符数据。CLOB 存储数据库字符集数据,NCLOB 存储 Unicode 国家字符集数据。对于变宽数据库字符集,CLOB 值使用两字节Unicode字符集存储在数据库中,该字符集具有固定宽度。Oracle将存储的Unicode值转换为客户端或服务器上请求的字符集,可以是固定宽度或可变宽度。当您使用可变宽度字符集将数据插入 CLOB 列时,Oracle 会先将数据转换为 Unicode,然后再将其存储到数据库中。”
http://docs.oracle.com/cd/B10500_01/server.920/a96524/c13datyp.htm#3234
关于Oracle LOB 未内联存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23081436/