Performance Sybase文本与Oracle CLOB性能

Performance Sybase文本与Oracle CLOB性能,performance,oracle,jdbc,sybase,clob,Performance,Oracle,Jdbc,Sybase,Clob,我们正在将数据库从Sybase转换为Oracle的过程中,遇到了性能问题。在Sybase中,我们有一个文本字段,并在Oracle中将其替换为CLOB 这就是我们在java代码中访问数据的方式: while(rs.next()) { String clobValue = rs.getString(1); // This takes 176ms in Oracle! . . } 该数据库遍布全国,但Sybase及其文本数据检索没有任何性能问题 我们可以做些什么来提高性能吗 默认情况下

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

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

while(rs.next()) {
  String clobValue = rs.getString(1);  // This takes 176ms in Oracle!
  .
  .
}
该数据库遍布全国,但Sybase及其文本数据检索没有任何性能问题


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

默认情况下,LOB不会与表数据一起获取,在
getString
中获取它们需要额外的往返数据库

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

一些其他选项:

LOB列是在线存储(在数据行中)还是离线存储(在单独的位置)?如果LOB列往往较小(小于4k),则可以使用
启用行中存储
子句通知Oracle尽可能在线存储数据

如果LOB较大且经常使用,它们是否存储在缓冲区缓存中?10g中的默认值是LOB是NOCACHE,这意味着针对它们的每个i/o操作都涉及到对数据库的直接读取,这是一个同步磁盘事件,可能会很慢。数据库跟踪将显示
直接路径读取/直接路径写入
事件的显著等待


《Oracle应用程序开发人员指南》中的“大型对象”是一本很有价值的书。

我们决定采用一种不同的方法,这将允许我们忽略clob性能


我们当前的代码(不是我写的!)查询数据库中的一个表并检索表中的所有信息,包括CLOB,尽管并不一定要一直检索它们。相反,我们在varchar中创建了另一个具有前4k个字符的字段,并对其进行查询。然后,当我们需要完整的clob时,我们会单独查询它,而不是所有记录的所有clob。

不幸的是,我们没有使用这个框架。我们正在Solaris上使用JDBC。将此标记为答案,因为它最接近于提供可能导致答案的信息:)