我们正在将数据库从Sybase转换为Oracle,我们遇到了性能问题。在Sybase中,我们有一个TEXT字段,并用Oracle中的CLOB替换它。
这是我们在java代码中访问数据的方式:
while(rs.next()) {
String clobValue = rs.getString(1); // This takes 176ms in Oracle!
.
.
}
数据库遍布全国各地,但我们在Sybase及其检索TEXT数据方面没有任何性能问题。
我们可以做些什么来提高这种性能吗?
答案 0 :(得分:4)
默认情况下,LOB不会与表数据一起被提取,并且需要额外往返数据库才能在getString
中获取它们。
如果您使用的是Oracle的.NET
提供程序,则可以将数据读取器设置中的InitialLOBFetchSize
设置为足够大的值,以便在内存中容纳大对象,以便可以全部获取它们。与其他数据。
答案 1 :(得分:3)
其他一些选择:
LOB列是在线存储(在数据行中)还是在线外(在单独的位置)?如果LOB列往往很小(大小不超过4k),则可以使用ENABLE STORAGE IN ROW
子句告诉Oracle尽可能在线存储数据。
如果您的LOB较大且经常使用,它们是否存储在缓冲区缓存中? 10g中的默认值是LOB是NOCACHE
,这意味着针对它们的每个i / o操作都涉及对数据库的直接读取,这是一个同步磁盘事件,这可能很慢。数据库跟踪将显示direct path read / direct path write
事件的重要等待。
This chapter - 大对象将是有价值的阅读。
答案 2 :(得分:0)
我们决定采取不同的方法,让我们忽略clob的表现。
我们当前的代码(我没有写它!)查询数据库中的一个表并检索表中的所有信息,包括clobs,即使不是必须全部检索它们。相反,我们创建了另一个字段,其中包含varchar中的前4个字符,而是查询。然后,当我们需要完整的clob时,我们会逐个查询它,而不是所有记录的所有clob。