【问题标题】:Oracle don't use index after drop partitionsOracle 删除分区后不使用索引
【发布时间】:2021-11-22 10:08:51
【问题描述】:

我们在 Oracle 12c 中通过 pk 进行简单连接

select *
from fcfcore.fsc_cash_flow_fact cff
inner join fcfcore.fsc_account_dim ad
   on cff.account_key = ad.account_key;

还有两个轮廓(开发、测试)。表、索引和其他的结构是相同的,但是在一个(dev)上,在解释计划中我们看到索引范围扫描/唯一扫描,但在另一个(测试)中只是全扫描,这是非常可悲和缓慢的。 以前,所有轮廓上的计划都是相同的,并且使用索引。唯一改变的是 - 在测试中删除旧分区,但最后我们只得到索引 XPKFSC_ACCOUNT_DIM 停止工作,所以看起来很巧合,但可能受到影响。该索引也已停止在其他查询中使用。

开发

fsc_cash_flow_fact ~ 12kk partitioned table by date
XIF1FSC_CASH_FLOW_FACT - local index on account_key

fsc_account_dim ~ 23kk
XPKFSC_ACCOUNT_DIM - pk on account_key

测试

fsc_cash_flow_fact ~ 1kkk partitioned table by date
XIF1FSC_CASH_FLOW_FACT - local index on account_key

fsc_account_dim ~ 23kk
XPKFSC_ACCOUNT_DIM - pk on account_key

重建索引,收集统计数据 - 没有帮助。提示是最后的希望,但我认为如果索引在许多查询中不起作用,则不是一个好的解决方案。

有什么想法可能是错的吗?

【问题讨论】:

  • 提供表和索引的结构。目前尚不清楚您为什么在测试端删除了分区?如果索引没有被使用,CBO 认为它比正常的全扫描更昂贵。还有语句的执行计划。我可以看到你没有使用任何分区修剪,因为没有 where 子句
  • 按照here 的描述发布执行计划。另请注意,对于没有Where 谓词的连接,您通常期望hash join 带有两个full table scans,除非您优化以在SQL*Developer 中快速查看first_rows(您不'没有说明)。

标签: sql oracle indexing


【解决方案1】:

索引是主键索引,所以它是全局索引。由于删除分区,索引变得不可用。 通常重建索引加上收集统计信息可以解决这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-08
    • 2018-12-23
    • 2013-06-02
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    相关资源
    最近更新 更多