【发布时间】:2012-08-18 06:23:25
【问题描述】:
我有一个 PL/SQL 函数可以从 MySQL 复制 GROUP_CONCAT()。该函数接受一个 CURSOR 并返回一个 VARCHAR2。但是,我的应用程序中有一些对象有足够的数据,连接字符串的大小大于 4000。由于我在 SELECT 语句(而不仅仅是 PL/SQL)中使用了这个函数,这让 Oracle 很生气并抛出了 ORA -06502.
所以,我将函数改为返回 CLOB。这可以解决错误,但是当使用 JDBC 读取数据时,性能会受到很大影响。我正在读取大量数据并从 VARCHAR2 切换到 CLOB 导致执行时间降低 10-20 倍。我一直在研究以某种方式对此进行优化,但是由于 CLOB 是从函数返回的并且不在表中,所以我读过的大部分内容都不适用。
有什么办法可以改善吗?我想强调的是,这与实际数据库的性能没有任何关系。连接最多 4000 个字符的值非常快,只有少数对象需要超过 4000 个字符,最大的值在 5000 个字符左右。 LOB 通常针对大型原始数据进行优化,如果不是 Oracle 对 SELECT 语句中存在的列的大小限制,我不需要这样做。
EDIT - 我想重申 CLOB 是在一个函数中创建的,它没有读取数据库中的任何 CLOB。它只是连接 VARCHAR2 并将结果作为 CLOB 返回。
【问题讨论】:
-
你是如何取回数据的?可能也想看看这个:docs.oracle.com/cd/B19306_01/appdev.102/b14249/…
-
我在一行中获取每个对象的所有数据。这就是我连接值而不是仅仅读取多行的原因。一切都很好,直到我发现某些对象在其中一个连接列中有超过 4000 个字符。该 Oracle 文档在这种情况下不是很有帮助,因为我从一个函数创建 CLOB 仅仅是因为 4000 个字符的 VARCHAR2 限制;没有 CLOB 存储在数据库中。如果可能的话,我根本不会使用 CLOB。
-
我的意思是,您是使用 getString() 还是打开流来获取数据?