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 关闭数据库连接?
如何从具有执行类型作为嵌入式查询的 Control-M 数据库作业运行 SQL Developer 中存在的存储过程
如何在 Oracle SQL Developer 中查询数据库名称?