3

如果我在 PL/SQL 存储过程中使用许多 CLOB 变量来存储许多长字符串,是否存在性能问题?CLOB的长度也是可变的吗?CLOB 是否有任何已知的限制/缺点,而不是使用 varchar2 和 long?

4

3 回答 3

5

CLOB 的长度是可变的,是的。上限因您使用的 Oracle 版本和数据库块大小而异。对于 11G,限制是“4G * DB_BLOCK_SIZE 参数的值”(来自11G PL/SQL Language Reference)。VARCHAR2 值在 PL/SQL 中限制为 32767 个字节。

我没有任何关于 PL/SQL 中 CLOB 与 VARCHAR2 的相对性能的确切信息,而且简短的 Google 也没有返回任何有用的信息。但是,我强烈怀疑 VARCHAR2 通常比 CLOB 执行得更好(对于可以存储在其中的数据),因为它更简单。您可以通过使用 VARCHAR2 和 CLOB 编写相同的简单程序一次并运行每 1000 次并比较总运行时间来轻松设置测试以证明此正确或错误。Tom Kyte 的Runstats实用程序在这里提供了很大的帮助,并显示了两种方法在 Oracle 资源方面的其他差异。

我的建议是:如果您的数据将超过 32K,那么您必须使用 CLOB;如果不是,那么不要使用 CLOB,使用 VARCHAR2。

注意:如果 CLOB 对于所有大小的字符数据都比 VARCHAR2 好,Oracle 可能会弃用VARCHAR2,就像他们对 LONG 数据类型所做的那样 - 但他们没有。

于 2010-04-15T10:14:14.933 回答
2

CLOB 比 VARCHAR2 更昂贵(更慢)并且更难使用。如果您不必要地使用 CLOB 而不是 VARCHAR2,那么您将遭受可衡量的性能损失。

最后,您应该如前所述,为正确的工作使用正确的数据类型。

1) 如果您在数据库中存储 4000 字节或更少,请使用 VARCHAR2,否则使用 CLOB。

2) 如果您在 PLSQL 中存储 32k 字节或更少,请使用 VARCHAR2,否则使用 CLOB。

这完全取决于您的需要。如果您的数据可以超过 VARCHAR2 限制,则使用 CLOB,否则使用 VARCHAR2。

至于明显的负面因素,请考虑在使用任何类型的 LOB 数据类型时,LOB 可以是 TEMPORARY(从不存储在表中的实际行中)或 PERMANENT(存储在表中的实际行中)。如果您在 PLSQL 中动态构建一个 CLOB 并将该 CLOB 传递给 JAVA 或其他外部客户端,那么您已经创建了一个临时 CLOB 并将其推到 Oracle 数据库的控制之外。这意味着接受临时 CLOB 的代码现在负责在 CLOB 完成后释放它。您的代码必须具有可用于此目的的环境本机方法。如果你不这样做,你的临时存储表空间最终将被填满,你的数据库将停止(停止工作)。它不会崩溃,它只是不起作用。可能需要重新启动。

祝你好运。

于 2010-05-30T01:07:41.867 回答
0

CLOB 变量基本上是指针,所以它们本身并不慢。问题是访问 CLOB 的内容。在我的经验中:

  • 依靠 Oracle 的隐式 CLOB <-> VARCHAR2 转换往往很
  • 使用该dbms_lob软件包是相当高效的。只需循环执行此操作:
    1. 将一大块数据从 CLOB 中获取到缓冲区中
    2. 使用缓冲区中的数据。也许将其转换为另一块数据。
    3. 可能将转换后的数据块写入目标 CLOB。
于 2010-08-30T11:19:57.803 回答