用文字查询慢,用变量查询快 - Oracle/Toad
Posted
技术标签:
【中文标题】用文字查询慢,用变量查询快 - Oracle/Toad【英文标题】:Query slow with literal and fast with variables - Oracle/Toad 【发布时间】:2019-08-10 16:01:25 【问题描述】:我有 2 个查询:文字在 13 秒内,变量在 60 毫秒内。
我尝试将“to_date”放入文字中,但没有任何改变,13 秒
这在 13 秒内,成本 49.338 ,基数 4(全表访问):
select *
from registros, pagamentos
where
REGISTROS.DT_REGISTRO <= '10/06/2019' and REGISTROS.DT_REGISTRO >= '10/06/2018'
and dt_sistema<= '10/06/2019' and REGISTROS.DT_SISTEMA >= '10/06/2018'
and REGISTROS.DT_COMPETENCIA <= '10/06/2019 'and REGISTROS.DT_COMPETENCIA >= '10/06/2018'
and PAGAMENTOS.SQ_PAGAMENTO = REGISTROS.PAGTO_SQ_PAGAMENTO ;
这在 60 毫秒内,成本 14.412,基数 1:
select *
from registros, pagamentos
where
REGISTROS.DT_REGISTRO <= :p_data and REGISTROS.DT_REGISTRO >= :p_data2
and dt_sistema<= :p_data and REGISTROS.DT_SISTEMA >= :p_data2
and REGISTROS.DT_COMPETENCIA <= :p_data and REGISTROS.DT_COMPETENCIA >= :p_data2
and PAGAMENTOS.SQ_PAGAMENTO = REGISTROS.PAGTO_SQ_PAGAMENTO ;
【问题讨论】:
尝试更改执行顺序..(似乎是缓存问题) 对每个查询运行解释计划并发布结果。 这个:'10/06/2019'
是一个字符串。如果您与之比较的列是date
数据类型,则Oracle 必须执行隐式转换。尝试使用日期;日期文字在这里可能是一个不错的选择,例如and dt_sistema <= date '2019-06-10'
测试时,在运行每个查询之前刷新缓冲区缓存,以确保第二个查询不会更快,因为它是由缓冲区提供的。然后你就可以真正比较这两个查询了。
【参考方案1】:
https://oracle-base.com/articles/misc/literals-substitution-variables-and-bind-variables
注意绑定变量和共享池
【讨论】:
以上是关于用文字查询慢,用变量查询快 - Oracle/Toad的主要内容,如果未能解决你的问题,请参考以下文章