gpt4 book ai didi

oracle - JDBC 的性能问题

转载 作者:行者123 更新时间:2023-12-04 04:32:20 26 4
gpt4 key购买 nike

我目前面临一个问题,即在我的 Java 应用程序中发出特定的 SQL 查询大约需要 30 秒,但在 SQL 客户端(SQL Developer)中却不到 1 秒。

在问题中,
Slow query in Java by JDBC but not in other systems (TOAD) ,建议使用绑定(bind)到 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'))

其中 view_ 是一个复杂 View ,包含表和其他复杂 View 的聚合。查询作为 PreparedStatement 执行,但没有任何参数。无论我们使用准备好的语句还是简单的语句,似乎都没有区别。

由于执行计划非常庞大,因此我无法在此处发布所有内容,但相关的区别似乎是:

UNION-ALL
表访问完整 GVC_WH.PLAYER_FACT_DAILY 表 37 6717151 596,934.317 19940 240 7621178231 19502

UNION-ALL
按索引 ROWID 访问表 GVC_WH.PLAYER_FACT_DAILY 表 38 2657 236.120 2429 30 20544658 2428
索引范围扫描 GVC_WH.PK_AGG_PLAYER 索引(唯一) 37 2657 16 1 638743 16

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

难道是使用函数 get_time_id 在通过 JDBC 使用时禁止使用索引,即使它不是列上的函数,即使它似乎在 SQL Developer 中工作?

最佳答案

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

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

关于oracle - JDBC 的性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4078712/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com