“用户对日期范围进行了选择*”。
众所周知,日期范围扫描很难调整。一个非常适合
date '2018-04-01' to date '2018-04-02'
可能会很糟糕
date '2017-04-01' to date '2018-04-01'
。当然,反之亦然。
因此,您可能在这里遇到的问题是,您的用户正在使用绑定变量作为日期范围值。绑定变量通常有助于提高性能,因为它们允许Oracle对查询的所有执行重复使用相同的执行计划,并为这些变量指定任何值。当相关值具有正态分布时,这是一件好事。然后,我们节省了硬解析的成本,并使用了有效的路径。这称为绑定变量窥视。
然而,当数据分布不均或指定范围时,我们需要不同的策略。与使用索引读取来检索表中20%的行相比,硬解析的开销微不足道。因此,您需要一种不同的方法,一种不依赖于绑定变量的方法。理想情况下,您可以与用户一起工作,了解他们在做什么,并帮助他们编写更好的查询。但是,Oracle数据库确实具有自适应游标之类的功能,允许数据库评估缓存的计划是否仍然适合绑定变量的新值。这并不能保证良好的性能,但在用户运行特殊查询的情况下会有所帮助。
Find out more
。
“基础表是按日期分区的,也按日期索引的,因此我认为日期范围不应成为问题。”
信念与证明不同。如果日期范围在单个分区内,那么可能不是问题所在。如果查询的范围跨越多个分区,那么它就是潜在的罪魁祸首。考虑:如果您的表被划分为“一天”部分,则日期范围为
日期“2017-04-01”至日期“2018-04-01”
将扫描
365个分区
。分区修剪对您没有多大帮助。但如果你认为这不值得调查,那很酷。
“我的一般问题是如何调整一件事而不破坏另一件事(你可能没有意识到)”
我想你已经知道了,这是不可能的。我们所能希望的最好方法是调整查询,使其在我们所知道的条件下以最佳方式执行。如果可以编写一个查询,使其在任何场景中都能完美执行,那么所有Oracle调优顾问都不会像他们那样生活得很好。