Oracle LOB 未内联存储

标签 oracle database-performance clob

设置

我有一个 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)

场景

  1. 根据 oracle 文档,当 CLOB 大于 4000 字节时,它将以轮廓方式存储,否则以内联方式存储。

  2. 当我在该表中存储一个 clob 值的数据时,说“Hello”,然后我看到“演示表”和“演示表 LOB 段”的段信息,它表明所有数据都是进入表,并且 Lob 段中没有消耗新 block 。

  3. 当我存储总字符数小于 1500 的较大数据时,我也会得到与上面相同的行为。

  4. 但是,当我存储总字符数 > 2000 且 < 3000 的数据时,即使总字符数小于 3000,LOB 数据也会进入 LOB 段。

问题

  1. 为什么小于 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/

相关文章:

c# - Crystal 报表和 ODP.Net

sql - 使用从同一表计算的值更新表的最佳方法

Oracle CLOB 不能插入超过 4000 个字符?

python - cx_Oracle.STRING 到 Python 字符串转换

oracle - 对于触发器的 Oracle IMPDP REMAP_SCHEMA 问题(ORA-39083、ORA-00942)是否有好的解决方法?

postgresql - 性能调整 : Create index for boolean column

Mysql 性能介于和与限制之间

java - 使用 SQL DB 的 Java 程序的资源注意事项

xml - 甲骨文 10g : Reading XML values from Clob using XMLSequence and ExtractValue

mysql - 如何将 .dmp 文件 (Oracle) 导入 MySql DB?