Database 如何在内部处理oracle CLOB?

Database 如何在内部处理oracle CLOB?,database,oracle,clob,Database,Oracle,Clob,我在数据库中有一个列(CLOB类型),其中包含json字符串。这些json字符串的大小可以是非常可变的。在这些字符串少于4000个字符的情况下,我听说Oracle在内部将这些CLOB视为VARCHAR。然而,我很好奇这个过程到底是如何运作的。我感兴趣的是性能和直观地看到json存储的能力 如果数据库中的CLOB有50个字符,Oracle是否将此单个对象视为VARCHAR2(50)?Oracle是否需要将存储在列中的所有CLOB少于4000个字符才能将整个列视为VARCHAR?这一切是如何工作的?

我在数据库中有一个列(CLOB类型),其中包含json字符串。这些json字符串的大小可以是非常可变的。在这些字符串少于4000个字符的情况下,我听说Oracle在内部将这些CLOB视为VARCHAR。然而,我很好奇这个过程到底是如何运作的。我感兴趣的是性能和直观地看到json存储的能力

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

Oracle并不总是将short
CLOB
值视为
VARCHAR2
值。仅当您允许它这样做时,它才会使用
启用行中存储的
CLOB
存储选项执行此操作。例如:

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
的数据存储在表块中,紧挨着
ID
V1
的值。只要
CLOB
值的长度小于接近4000字节(即,4000减去占用
CLOB
空间的系统控制信息),它就会这样做

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

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

如果数据库中的CLOB有50个字符,Oracle是否将此单个对象视为VARCHAR2(50)

基本上,如果
CLOB
是使用
ENABLE STORAGE IN ROW
创建的。此选项不能在事后更改。我不会指望Oracle在各个方面都像对待
VARCHAR2
一样对待
CLOB
。例如,在行
CLOB
中存储的系统控制信息未存储在
VARCHAR2
列中。但在许多实际用途中,包括性能,它们非常相似

Oracle是否需要将存储在列中的所有CLOB少于4000个字符才能将整个列视为VARCHAR

不,是逐行的

这一切是如何运作的

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

Oracle并不总是将short
CLOB
值视为
VARCHAR2
值。仅当您允许它这样做时,它才会使用
启用行中存储的
CLOB
存储选项执行此操作。例如:

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
的数据存储在表块中,紧挨着
ID
V1
的值。只要
CLOB
值的长度小于接近4000字节(即,4000减去占用
CLOB
空间的系统控制信息),它就会这样做

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

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

如果数据库中的CLOB有50个字符,Oracle是否将此单个对象视为VARCHAR2(50)

基本上,如果
CLOB
是使用
ENABLE STORAGE IN ROW
创建的。此选项不能在事后更改。我不会指望Oracle在各个方面都像对待
VARCHAR2
一样对待
CLOB
。例如,在行
CLOB
中存储的系统控制信息未存储在
VARCHAR2
列中。但在许多实际用途中,包括性能,它们非常相似

Oracle是否需要将存储在列中的所有CLOB少于4000个字符才能将整个列视为VARCHAR

不,是逐行的

这一切是如何运作的


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

谢谢。但是,我了解到内联存储是LOB的默认设置,因此,我不需要显式启用行中的存储?是的,这是默认设置。我喜欢显式地设置我的设计所依赖的值,如果没有其他原因,它会在DDL中给我一行代码进行注释。谢谢。但是,我了解到内联存储是LOB的默认设置,因此,我不需要显式启用行中的存储?是的,这是默认设置。我喜欢显式地设置我的设计所依赖的值,如果没有其他原因,它会在DDL中给我一行代码进行注释。