Oracle PL/SQL:CLOB数据类型在PL/SQL中的性能表现

4

如果我在PL/SQL存储过程中使用多个CLOB变量来存储许多长字符串,是否会出现性能问题?CLOB的长度也是可变的吗?相比使用varchar2和long,使用CLOB有哪些已知的限制和缺点?

3个回答

5

CLOBs是长度可变的。上限取决于您使用的Oracle版本和数据库块大小。对于11G,限制为“4G * DB_BLOCK_SIZE参数的值”(来自11G PL/SQL语言参考)。在PL / SQL中,VARCHAR2值限制为32767字节。

我没有确切的关于CLOB与VARCHAR2在PL/SQL中相对性能的信息,简短的谷歌搜索也没有返回任何有用的结果。然而,我强烈怀疑VARCHAR2通常比CLOB表现更好(对于两者都可以存储的数据),因为它更简单。您可以很容易地设置一个测试来证明这一点,通过编写相同的简单程序一次使用VARCHAR2,一次使用CLOB,并运行每个1000次并比较总经过时间。Tom Kyte的Runstats实用程序在这里非常有帮助,并显示了Oracle资源方面的其他差异。
我的建议是:如果您的数据将超过32K,则必须使用CLOB;如果不超过,则不要使用CLOB,使用VARCHAR2。

注意:如果CLOB在所有字符数据大小方面都比VARCHAR2更好,Oracle可能会像他们对待LONG数据类型一样弃用VARCHAR2,但他们没有这样做。


2
CLOB比VARCHAR2更昂贵(速度更慢),且更难处理。如果你不必要地使用CLOB而不是VARCHAR2,那么你会受到可测量的性能惩罚。
最终,正如之前所提到的,你应该选择适合工作的正确数据类型。
1)如果在数据库中存储的字节数小于或等于4000,则使用VARCHAR2,否则使用CLOB。
2)如果在PLSQL中存储的字节数小于或等于32k,则使用VARCHAR2,否则使用CLOB。
这完全取决于你的需求。如果你的数据可能超过VARCHAR2限制,那么使用CLOB,否则使用VARCHAR2。
至于明显的负面影响,请考虑任何类型的LOB数据类型。LOB可以是TEMPORARY(从未存储在表中的实际行中)或PERMANENT(存储在表中的实际行中)。如果你在PLSQL中动态构建一个CLOB并将其传递给JAVA或其他外部客户端,则已创建临时CLOB并将其推出了Oracle数据库的控制范围。这意味着接受临时CLOB的代码现在负责在完成后释放CLOB。你的代码必须具有本地环境可用于此目的的方法。如果你未能这样做,你的临时存储表空间最终会填满,并且你的数据库将停止工作。它不会崩溃,只是无法工作。可能需要重新启动。问题在于许多开发工具(例如许多版本的Java)没有所需的库调用。
祝你好运。

0

CLOB变量基本上是指针,因此它们本身并不慢。问题在于访问CLOB的内容。根据我的经验:

  • 依赖Oracle的隐式CLOB <-> VARCHAR2转换往往比较慢。
  • 使用dbms_lob包是相当高效的。只需执行以下操作:
    1. 从CLOB中获取一块数据放入缓冲区
    2. 使用来自缓冲区的数据。可以将其转换为另一块数据。
    3. 可能将转换后的数据块写入目标CLOB。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接