【问题标题】:Oracle Internals - varchar and garbage collectionOracle 内部 - varchar 和垃圾回收
【发布时间】:2012-04-11 09:42:23
【问题描述】:

我的问题基于以下内容:我有一个代码块,其中定义了一个 varchar 字符串,如下所示:

v_string varchar(100);

我的代码块是这样的:

...   
v_string := 'x = ' || x || ', y = ' || y;
...

也就是说,v_string 是我用来记录xy 值的文本。

谁能解释一下 Oracle 是如何存储这种串联的字符串的?我的意思是,它会把这些放在一堆吗?如果是这样,这些会(可以)被垃圾收集吗?这对性能影响太大吗?

谢谢!

【问题讨论】:

    标签: string oracle performance garbage-collection heap-memory


    【解决方案1】:

    不会创建临时对象,因此不会有任何垃圾收集。

    当您声明 v_string 时,Oracle 会为字符串分配 100 字节的存储空间(假设您的 NLS_LENGTH_SEMANTICSBYTE 的默认值)(较大的字符串不会像这样预先分配,什么构成“较大string" 取决于版本。在 11.2 中,限制似乎是 4000 bytes 尽管它曾经是 2000 字节,我不确定它何时更改)。由于 100 字节的缓冲区已预先分配,因此很容易在该预先分配的缓冲区中将各种其他字符串连接在一起。无需分配任何额外空间来存储临时结果,因此无需释放任何资源。

    在某些时候,v_string 将超出范围,当然,为其分配的缓冲区将被释放。但这将在声明 v_string 的块的末尾。

    【讨论】:

    • 如果我需要超过 100 个字节怎么办? Oracle 可能会为字符串分配更多空间,对吧?如果是这样,旧的是留下来收集垃圾还是立即销毁?我问这个是因为我正在创建一些字符串来记录一个过程,并且我认为数据库已经放慢了一些速度,因为我一直在创建几个相当大的字符串。感谢您的信息。
    • @kaos12 - 如果您需要超过 100 个字节,则需要定义一个更大的变量。如果在 PL/SQL 中将 v_string 定义为 varchar2(100),它将始终占用 100 字节的内存。如果您要更改特定 PL/SQL 变量中的数据,则不会保留旧副本以进行垃圾收集——所有内容都在预分配的缓冲区中完成。当然,如果不生成需要被垃圾回收的对象,字符串连接和搜索可能会很昂贵。
    猜你喜欢
    • 2015-11-13
    • 1970-01-01
    • 2011-08-01
    • 2012-02-19
    • 2015-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多