首页 > 解决方案 > Oracle 查询:日期过滤器变得非常慢

问题描述

我有这个 oracle 查询大约需要 1 分钟才能得到结果:

SELECT TRUNC(sysdate - data_ricezione) AS delay
  FROM notifiche@fe_engine2fe_gateway n
 WHERE NVL(n.data_ricezione, TO_DATE('01011900', 'ddmmyyyy')) =
       (SELECT NVL(MAX(n2.data_ricezione), TO_DATE('01011900', 'ddmmyyyy'))
          FROM notifiche@fe_engine2fe_gateway n2
         WHERE n.id_sdi = n2.id_sdi)
--AND sysdate-data_ricezione > 15

基本上我有这个名为“notifiche”的表,其中每条记录代表对另一种类型的对象(发票)的一种更新。我想知道哪张发票在过去 15 天内没有收到任何更新。我可以通过加入 notifiche n2 表,获取每张发票的最新记录,并评估更新日期 (data_ricezione) 和当前日期 (sysdate) 之间的差异。

当我添加注释条件时,查询需要无限时间才能完成(我的意思是几个小时,从来没有看到它的结尾......)

这个简单的条件怎么可能使查询如此缓慢?

我怎样才能提高性能?

标签: sqloracleperformance

解决方案


尽量保持data_ricezione 独处;如果上面有索引,它可能会有所帮助。

所以:从

and sysdate - data_ricezione > 15

and -data_ricezione > 15 - sysdate / * (-1)

and data_ricezione < sysdate - 15

由于一切都通过数据库链接完成,请查看driving_site提示是否有任何好处,即

select /*+ driving_site (n) */                --> "n" is table's alias
  trunc(sysdate-data_ricezione) as delay
from
  notifiche@fe_engine2fe_gateway n
...

推荐阅读