Oracle JDBC的性能问题

Oracle JDBC的性能问题,oracle,jdbc,Oracle,Jdbc,我目前面临的一个问题是,从Java应用程序中发出一个特定的SQL查询大约需要30秒,但是由于传入了谓词,很可能会遇到绑定变量峰值问题。尝试运行以下查询以确认(即一致的运行时间) 所有对象的统计数据都是最新的吗 正如贾斯汀所说的,确保你的测量也正确。如果没有完整的查询,就很难提供额外的见解 在使用应用程序时,我会尝试在数据库上运行 然后您应该能够看到正在运行的查询以及实际的执行计划。这将准确地向您显示发生了什么,即它是否正在提取索引。检查以确保没有人将属性oracle.jdbc.defaultNC

我目前面临的一个问题是,从Java应用程序中发出一个特定的SQL查询大约需要30秒,但是由于传入了谓词,很可能会遇到绑定变量峰值问题。尝试运行以下查询以确认(即一致的运行时间)

所有对象的统计数据都是最新的吗

正如贾斯汀所说的,确保你的测量也正确。如果没有完整的查询,就很难提供额外的见解

在使用应用程序时,我会尝试在数据库上运行


然后您应该能够看到正在运行的查询以及实际的执行计划。这将准确地向您显示发生了什么,即它是否正在提取索引。

检查以确保没有人将属性oracle.jdbc.defaultNChar=true设置为正确


有时这样做是为了解决unicode问题,但这意味着所有列都被视为NVARCHAR。如果您在varchar列上有索引,则不会使用该索引,因为oracle必须使用函数来转换字符编码。

您可以获取并发布这两种情况的查询计划吗?为了清楚起见,您是否在衡量绩效方面保持一致?通常会意外地测量SQL Developer返回第一行的时间与Java代码获取最后一行的时间,这可能会有很大的不同。首先,我将查看每个方法(TOAD与Java)生成的执行计划(通过dbms_xplan.display cursor)。这将告诉您数据库是否以不同的方式处理查询。如果是这样,请密切关注谓词部分,因为这可能会为您提供一些线索,说明为什么(例如,从Java版本发生隐式数据类型转换,并导致Oracle无法使用索引)另请参见您是否在to_date调用中指定日期模式参数?我认为默认模式取决于您的区域设置,实际上可能与java代码或toad不同。如果您将查询拆分为
并从dual
中选择get\u time\u id(截止日期('2010-10-10','yyyyy-mm-dd'),然后将其传递到带有
的准备语句中,会有什么区别吗。。。时间id=?
您指的是什么变量?正如我所说,准备好的声明没有参数。此外,对于仅获取一行来说,性能差异也是数量级的。统计数据是最新的。根据游标共享参数的值,Oracle可以在语句上强制绑定变量。
select 
sum(col1),
sum(col2),
max(select ...)
from view_
where time_id = get_time_id(to_date('2010-10-10','yyyy-mm-dd'))
UNION-ALL TABLE ACCESS FULL GVC_WH.PLAYER_FACT_DAILY TABLE 37 6717151 596,934.317 19940 240 7621178231 19502 UNION-ALL TABLE ACCESS BY INDEX ROWID GVC_WH.PLAYER_FACT_DAILY TABLE 38 2657 236.120 2429 30 20544658 2428 INDEX RANGE SCAN GVC_WH.PK_AGG_PLAYER INDEX (UNIQUE) 37 2657 16 1 638743 16
alter session set “_optim_peek_user_binds”=false;