如果我在PL / SQL存储过程中使用许多CLOB变量来存储许多长字符串,是否存在任何性能问题? CLOB的长度是否也可变? CLOB是否有任何已知的限制/缺点,而不是使用varchar2和long?
答案 0 :(得分:5)
CLOB的长度是可变的,是的。上限根据您所使用的Oracle版本和数据库块大小而有所不同。对于11G,限制是“4G * DB_BLOCK_SIZE参数值”(来自11G PL/SQL Language Reference)。在PL / SQL中,VARCHAR2值限制为32767字节。
我没有关于PL / SQL中CLOB与VARCHAR2的相对性能的任何确切信息,并且简短的Google也没有返回任何有用的信息。但是我强烈怀疑VARCHAR2通常比CLOB表现更好(对于可以存储在其中的数据),因为它更简单。通过使用VARCHAR2编写相同的简单程序一次,使用CLOB编写一次,并运行每1000次并比较总耗用时间,您可以轻松地设置测试来证明这是对还是错。 Tom Kyte的Runstats实用程序在这里提供了很好的帮助,并显示了两种方法在Oracle资源方面的其他差异。
我的建议是:如果您的数据超过32K,那么必须使用CLOB;如果没有,那么不使用CLOB,使用VARCHAR2。
注意:如果CLOB优于VARCHAR2用于所有大小的字符数据,那么Oracle可能deprecate VARCHAR2,就像他们使用LONG数据类型一样 - 但他们没有。 / p>
答案 1 :(得分: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时释放CLOB。您的代码必须具有其环境本机的方法,您可以将其用于此目的。如果您没有这样做,您的临时存储表空间将最终填满,您的数据库将停止(停止工作)。它不会崩溃,它只是不起作用。可能需要重新启动。问题是许多开发工具(例如java的许多版本)没有所需的库调用。
祝你好运。答案 2 :(得分:0)
CLOB变量基本上都是指针,所以它们本身并不慢。问题是访问CLOB的内容。根据我的经验:
dbms_lob
包具有合理的性能。只需循环执行此操作: