【发布时间】: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(您不'没有说明)。