And*_*ndy 2 sql oracle bind-variables
这个问题可能更适合DB stackexchange站点,但我不确定.
无论如何,我正在处理优化查询,并且我了解到使用绑定变量会使解析器无法正常工作.我们已经看到正在运行的查询有所改进,但我想知道是否将我们的软件传入的静态变量用于绑定变量也是有帮助的.这是一个例子:
select *
from report
where report.name = :1
and report.enabled = '1'
我可以说出来
select *
from report
where report.name = :1
and report.enabled = :2
我只是做出改变,但是在软件中实际执行它并看到它所带来的差异的过程有点漫长而乏味.有没有人知道混合文字(如第一个例子中)是否会损害优化器效率,即使它们始终相同?
提前致谢.
我不确定你的意思I learned that using bind variables makes the parser not work as hard,但我猜...
您是在客户端构建SQL字符串并将它们发送到oracle数据库来执行吗?
如果是这样,参数化查询的行为意味着数据库引擎可以看到使用相同的执行计划/解释计划可以满足多个查询,尽管具有不同的参数.
这意味着引擎不需要重新编译本机SQL,并且可以(可能)在缓存中重新使用计划.
如果没有参数化,并且"name"的值不同,引擎会将查询视为完全不同,并且不会注意到相似性.这将导致要编译的SQL,除非确切相同的字符串已经在缓存中.
但是,如果您的查询始终存在report.enabled = 1,则无需对查询的该部分进行参数化.由于它是静态的,不使用参数的行为不会使它看起来像一个不同的查询,并且不会导致它被重新编译.
相反,您实际上可以根据索引,数据统计等进行节省.例如,如果99%的数据是"启用= 1",那么与1%的数据相比,您可能会获得不同的计划被"启用= 1".但是引擎只会在查询中针对"enabled = 1"进行优化,其中已知所查找的值始终为 1.并且仅在静态指定(作为文字)的情况下.
简而言之,如果它确实是静态值,请不要对其进行参数化.