用文字查询慢,用变量查询快 - 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 &lt;= date '2019-06-10' 测试时,在运行每个查询之前刷新缓冲区缓存,以确保第二个查询不会更快,因为它是由缓冲区提供的。然后你就可以真正比较这两个查询了。 【参考方案1】:

https://oracle-base.com/articles/misc/literals-substitution-variables-and-bind-variables

注意绑定变量和共享池

【讨论】:

以上是关于用文字查询慢,用变量查询快 - Oracle/Toad的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 查询调优 - 为啥使用变量中的值比使用文字慢得多?

Mysql 用 php 慢

解决mongodb查询慢的问题

localhost连接慢如何解决?

索引与慢查询优化

ORACLE分组排序查询