性能调优没有像数据卷的详细信息,数据偏差,指数defintions,解释计划等只是猜测。
因此,这里有一些更多的猜测:)
你的驱动表应该是tariffe tNew
因为这是你使用顶部的结果集的一个。现在
tNew.validity_date < to_date('2017-6-26','YYYY-MM-DD'))
,除非tNew.stato_attivo = 'f'
是极具选择性你会在表中可以检索大块的所有行(根据记录多远后面走),所以全表扫描将是最抓住这些记录的有效方法。
tariffe tAtt
上的连接有问题,因为idtariffa
不是唯一的列。所以加入是对一组tAtt
记录的一组tNew
记录。这些将在内存中使用WHERE子句中的条件进行过滤。
单列索引
“所有有关领域我已经把指数”不会在这里帮助。你可能会得到所有相关列从一个复合索引有些欣喜:
tariffe (stato_attivo , validity_date, idtariffa, dataimport)
这将是值得的,如果你经常运行此查询建设。
任何其他猜测?子查询保理一次打到主表。如果tariffe
有很多列,那么只进行一次全表扫描会加快速度。
with cte as (
select stato_attivo , validity_date, idtariffa, dataimport
from tariffe
where validity_date < to_date('2017-6-26','YYYY-MM-DD'
)
select count(tNew.idtariffa) CONT
from cte tNew
join cte tAtt on tAtt.idtariffa = tNew.idtariffa
where (tAtt.stato_attivo = 't')
and (tNew.stato_attivo = 'f')
and (tAtt.validity_date < tNew.validity_date)
and (tAtt.dataimport < tNew.dataimport)
来源
2017-07-26 14:04:09
APC
不加入,从1表计数。 –
我有点新bie我不明白 –
查看查询执行计划 – I3rutt