如何在内部处理 oracle clobs?

How are oracle clobs internally handled?

我在数据库中有一列(CLOB 类型),其中包含 json 个字符串。这些 json 字符串的大小可能变化很大。如果这些字符串少于 4000 个字符,我听说 Oracle 在内部将这些 CLOB 视为 VARCHAR。但是,我很好奇这个过程究竟是如何工作的。我感兴趣的是视觉上看到 json 被存储的性能和能力。

如果数据库中的 CLOB 有 50 个字符,Oracle 会将这个单个对象视为 VARCHAR2(50) 吗?存储在列中的所有 CLOB 是否需要少于 4000 个字符,Oracle 才能将整个列视为 VARCHAR?这一切是如何运作的?

Oracle 不会总是 将短 CLOB 值视为 VARCHAR2 值。只有在您允许它使用 ENABLE STORAGE IN ROWCLOB 存储选项时,它才会这样做。例如,

create table clob_test (
    id      number NOT NULL PRIMARY KEY, 
    v1      varchar2(60),
    c1      clob
) lob(c1) store as (enable storage in row);

在这种情况下,Oracle 会将 C1 的数据存储在 table 块中,就在 IDV1 的值旁边。只要 CLOB 值的长度小于 接近 4000 字节(即 4000 减去 space 在CLOB)。

在这种情况下,CLOB 数据将像 VARCHAR2 一样读取(例如,存储 CHUNK 大小变得无关紧要)。

如果 CLOB 变得太大,Oracle 会像任何大的 CLOB 值一样悄悄地将它从块中移出到单独的存储中。

If a CLOB in the DB has 50 characters does Oracle treat this single object as VARCHAR2(50)?

基本上,如果 CLOB 是用 ENABLE STORAGE IN ROW 创建的。此选项事后无法更改。我不会指望 Oracle 在各个方面都将 CLOB 完全 视为 VARCHAR2。例如,系统控制信息存储在行内 CLOB 中,但未存储在 VARCHAR2 列中。但出于许多实际目的,包括性能,它们非常相似。

Do all CLOBs stored in the column need to be less than 4000 characters for Oracle to treat the whole column as a VARCHAR?

没有。它是逐行显示的。

How does this all work?

我尽我所能解释了我所知道的。 Oracle 不发布其内部算法。