当我使用SQL Developer运行查询并使用像:type
之类的绑定变量时,系统会提示我输入要使用的值,然后查询的运行速度比使用固定的文字值替换绑定变量要快得多,比如说'A'
。
例如第一个运行速度比第二个查询快的查询:
首次查询(运行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分钟。
答案 0 :(得分:1)
这是一个有趣的测试:只是为了好玩,更改绑定变量的名称(例如,将它们称为:x,:y和:z) - 或者更好的是,只需更改其中一个变量中的一个字母。第一次运行查询时,它应该与第二个查询一样长,如果所有其他条件都相同(从不存在)。
使用绑定变量的一个优点是查询只被解析一次。引擎仍然需要运行查询,但是避免了解释查询,优化查询等所增加的开销。技术术语是“软解析”与“硬解析”。很好的阅读:
https://blogs.oracle.com/sql/entry/improve_sql_query_performance_by