SQL Developer 中没有参数的查询运行缓慢

Posted

技术标签:

【中文标题】SQL Developer 中没有参数的查询运行缓慢【英文标题】:Queries runs slow without parameters in SQL Developer 【发布时间】:2016-04-26 14:32:54 【问题描述】:

当我使用 SQL Developer 运行查询并使用 :type 之类的绑定变量时,系统会提示我输入要使用的值,然后查询运行速度比我用固定文字值替换绑定变量时更快,例如 @987654322 @。

例如第一个查询比第二个查询运行得更快:

第一个查询(运行 0.5 秒)

select DMDUNIT, LOC, SUM(QTY)
from hist
where dmdunit = :lv_dmdunit and type = :lv_type and loc = :lv_loc
and startdate >= sysdate - 40
GROUP BY DMDUNIT,LOC

第二次查询(运行 1.7 秒)

select DMDUNIT, LOC, SUM(QTY)
from hist
where dmdunit = 'PROD_1' and type = 'A' and loc = 'B101'
and startdate >= sysdate - 40
GROUP BY DMDUNIT,LOC

为什么第一个查询比第二个查询运行得更快?我可以采取哪些步骤使第二个查询与第一个查询一样快地运行?

这是一个小查询,1 秒没有太大区别,但我也有大型查询,其中相同查询(参数和非参数)之间的差异为 10 到 15 分钟。

【问题讨论】:

两个查询的执行计划显示什么?您使用的是哪个版本的 Oracle 数据库? (此外,在 SQL Developer 中,如果您不想在出现提示时继续键入它们,您可以使用 variable 命令和匿名块将绑定值设置为脚本的一部分) 可能与“参数嗅探”有关——进行搜索以找到更多信息。 【参考方案1】:

这是一个有趣的测试:只是为了好玩,更改绑定变量的名称(例如,将它们称为 :x、:y 和 :z) - 或者,更好的是,只需更改其中一个变量中的一个字母.第一次运行查询的时间应该与第二次查询一样长,如果其他条件都相同(它永远不会)。

使用绑定变量的优点之一是查询只被解析一次。引擎仍然需要运行查询,但是避免了解释查询、优化查询等的额外开销。技术术语是“软解析”与“硬解析”。很好的阅读:

https://blogs.oracle.com/sql/entry/improve_sql_query_performance_by

【讨论】:

以上是关于SQL Developer 中没有参数的查询运行缓慢的主要内容,如果未能解决你的问题,请参考以下文章

如何防止 Oracle SQL Developer 关闭数据库连接?

如何清除Oracle中的所有缓存项

如何从具有执行类型作为嵌入式查询的 Control-M 数据库作业运行 SQL Developer 中存在的存储过程

如何在 Oracle SQL Developer 中查询数据库名称?

无法通过 12 c 中的 sql developer 在 sql 查询中添加空列

oracle sql developer 能否直接修改sql查询出的数据?