JDBC的性能问题

Seb*_*ndt 9 oracle jdbc

我目前面临的问题是,在我的Java应用程序中,特定的SQL查询需要大约30秒才能发出,而在SQL客户端(SQL Developer)中则需要<1秒.

在问题中,
JDBC中的Java查询慢而不是其他系统(TOAD),建议使用绑定到java变量的PreparedStatement可以使查询执行速度远远慢于SQL客户端(在这种情况下为TOAD)因为Oracle对使用哪些索引感到困惑.这可能是没有参数的PreparedStatement的问题吗?

否则可能是什么问题?

查询看起来像

select 
sum(col1),
sum(col2),
max(select ...)
from view_
where time_id = get_time_id(to_date('2010-10-10','yyyy-mm-dd'))
Run Code Online (Sandbox Code Playgroud)

其中view_是一个包含表和其他复杂视图聚合的复杂视图.查询作为PreparedStatement执行,但没有任何参数.我们是使用预准备语句还是仅使用普通语句似乎没有区别.

由于执行计划非常庞大,我不能在这里发布所有内容,但相关的差异似乎是:

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 

第一个片段来自使用JDBC瘦客户端运行时的第二个片段,第二个片段来自在SQL Developer中运行时的片段.当使用JDBC瘦客户端作为语句(无论我是否使用预准备语句)运行时,它没有获取正确的索引.第一个时间差为30秒,第二个时间为0.5秒.

可能是因为使用函数get_time_id禁止在使用JDBC时使用索引,即使它不是列上的函数,即使它似乎在SQL Developer中工作?

erb*_*ock 1

由于传入谓词,您很可能会遇到绑定变量峰值问题。尝试使用以下命令运行查询来确认(即一致的运行时间)

\n\n
alter session set \xe2\x80\x9c_optim_peek_user_binds\xe2\x80\x9d=false;\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n