5

我们正在将我们的数据库从 Sybase 转换为 Oracle,并且遇到了性能问题。在 Sybase 中,我们有一个 TEXT 字段,并在 Oracle 中将其替换为 CLOB。

这就是我们在 java 代码中访问数据的方式:

while(rs.next()) {
  String clobValue = rs.getString(1);  // This takes 176ms in Oracle!
  .
  .
}

该数据库遍布全国,但 Sybase 及其对 TEXT 数据的检索仍然没有任何性能问题。

我们可以做些什么来提高这种性能吗?

4

3 回答 3

4

默认情况下,LOB 不会与表数据一起获取,并且需要额外往返数据库才能将它们获取到getString.

如果您使用 Oracle 的.NET提供程序,您可以InitialLOBFetchSize在数据读取器设置中设置一个足够大的值以容纳内存中的大对象,以便可以将它们与其他数据一起全部获取。

于 2011-07-19T17:05:59.813 回答
3

其他一些选项:

LOB 列是在线存储(在数据行中)还是离线存储(在单独的位置)?如果 LOB 列往往很小(小于 4k),您可以使用该ENABLE STORAGE IN ROW子句告诉 Oracle 在可能的情况下以内联方式存储数据。

如果您的 LOB 较大且经常使用,它们是否存储在缓冲区缓存中?10g 中的默认设置是 LOB NOCACHE,这意味着针对它们的每个 i/o 操作都涉及对数据库的直接读取,这是一个同步磁盘事件,这可能很慢。数据库跟踪将揭示direct path read / direct path write事件的大量等待。

Oracle Application Developer's Guide - Large Objects 的这一章值得一读。

于 2011-07-19T18:30:54.247 回答
0

我们决定采用一种不同的方法来忽略 clob 性能。

我们当前的代码(不是我写的!)查询数据库中的一个表并检索表中的所有信息,包括 clob,尽管并非完全有必要每次都检索它们。相反,我们使用 varchar 中的前 4k 个字符创建了另一个字段,并改为查询该字段。然后,当我们需要完整的 clob 时,我们逐个查询它,而不是所有记录的所有 clob。

于 2011-07-22T02:07:45.440 回答