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

Oracle SQL查询在JdbcTemplate中花费的时间太长&;SimpleJdbcTemplate,sql,oracle,spring,jdbc,jdbctemplate,Sql,Oracle,Spring,Jdbc,Jdbctemplate,应用程序中使用SimpleJdbcTemplate的oracle SQL查询从未(几乎)出现。查询非常长,它连接近15个表,选择大约100个字段,以此类推 查询将近8500个字符,使用MapSqlParameterSource实例添加了6个绑定变量。我已经在行映射器方法调用中放置了足够多的日志消息,尽管这些消息从未打印出来 用实际值替换绑定变量后的相同SQL查询在SQL*Plus&SQL Developer中5-7秒内生成结果。结果只有15条记录,因为我使用该逻辑在SQL查询本身中实现分页支持

应用程序中使用SimpleJdbcTemplate的oracle SQL查询从未(几乎)出现。查询非常长,它连接近15个表,选择大约100个字段,以此类推

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

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

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

更新::

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

目前,我正在参考以下链接以更正我的dblink/同义词用法,


谢谢,

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

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

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

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

如果两个不同的连接方法之间的性能不同,请确保它们不会更改会话优化器设置

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

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

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

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