Oracle SQL 查询在 JdbcTemplate 和 SimpleJdbcTemplate 中花费的时间太长

Posted

技术标签:

【中文标题】Oracle SQL 查询在 JdbcTemplate 和 SimpleJdbcTemplate 中花费的时间太长【英文标题】:Oracle SQL Query takes too long in JdbcTemplate & SimpleJdbcTemplate 【发布时间】:2013-04-23 07:07:45 【问题描述】:

在我们的应用程序中使用 SimpleJdbcTemplate 的 oracle SQL 查询永远不会(几乎)出现。查询很长,连接了将近 15 个表,选择了大约 100 个字段等等。

查询将近 8500 个字符,使用 MapSqlParameterSource 实例添加了 6 个绑定变量)。我已经在 Row Mapper 方法调用中放置了足够多的日志消息,尽管这些消息从未被打印出来。

用实际值替换绑定变量后的相同 SQL 查询在 SQL*Plus 和 SQL Developer 中会在 5-7 秒内产生结果。结果只有 15 条记录,因为我使用该逻辑在 SQL 查询本身中实现分页支持。

我尝试了 JDBCTemplate 和 SimpleJdbcTemplate。 知道可能出了什么问题吗??

更新 ::

我能够缩小问题的范围。我的查询包含一个同义词,因为 LEFT OUTER JOIN(它引用了不同的模式表)正在减慢整个查询的速度。当我将此连接与绑定变量一起使用时,就会发生这种情况。当我在 SQL Developer 和 SQL*Plus 中硬编码绑定变量的值时,查询运行良好。但是当我使用绑定变量时,同样的事情(挂起情况)也发生在这些工具中。

目前我指的是以下链接来纠正我的 dblink/synonym 用法, Getting a ResultSet/RefCursor over a database link

谢谢,

【问题讨论】:

【参考方案1】:

如果您在两种不同的连接方法之间有不同的性能,请确保它们不会改变会话优化器设置。

也许您的 jdbc 代码以某种方式指定了 optmizer 模式,因此当您通过 sqlplus 连接时形式不同。

alter session set OPTIMIZER_MODE = RULE;
alter session set OPTIMIZER_MODE = choose;

我在我们的环境中也遇到过这样的问题,所以我确保所有连接都使用相同的优化设置。

【讨论】:

我在创建连接时没有使用特定的 JDBC 配置参数。我使用 DriverManager.createConnection 调用通过简单的 JDBC 连接(无数据源/Spring)完成了对相同 SQL 的测试。同样的行为也在此连接中重复。我在同一连接中尝试了两种优化器模式,并重复执行 SQL 语句。但没有运气! 如果你有权限,你可以运行“select value from v$parameter where name='optimizer_mode';”查看您的两个会话是否具有相同的设置。如果您没有权限,您仍然可以使用 alter 语句在 sql developer 中手动设置优化器模式。如果查询在所选模式下运行得很快,则在 JDBC 连接中使用相同的 alter 语句,看看它是否仍然执行缓慢。 您也可以尝试在语句中使用提示。也许 oracle 对语句使用不同的执行计划。 打印的所有选项中的优化器模式是 all_rows (这是一个基于成本的优化器),我所有的表都是分析过的。不要认为这是数据库方面的性能问题,即使有误导性的查询提示,在 Oracle 工具中查询在 1 分钟内完成,而 JDBC 连接结果在 3 小时后从未出现......!! 如果您认为是JDBC连接的问题,您是否尝试过“select * from dual;”看看这是否也返回缓慢?

以上是关于Oracle SQL 查询在 JdbcTemplate 和 SimpleJdbcTemplate 中花费的时间太长的主要内容,如果未能解决你的问题,请参考以下文章

ORACLE LEFT JOIN 子查询 在SQL SERVER中可以使用如图中的子查询,ORACLE中怎么实现

怎么查询oracle中响应时间最长的sql语句,并列出平均响应时间

如何在执行查询时自动保存oracle SQL查询?

在oracle里,一个sql多表查询,单独执行能利用索引提高速率,但外层套上分页时,会全表扫描,如何解决,求助高手

oracle 中的 sql语句查询

oracle SQL查询语句