Oracle 查询忽略分区表上的本地索引

问题描述 投票:0回答:1

我在 Oracle 中有一个分区表 SHARED_RAW_RE_GL78,按列 MONTHID 分区。该表约有 3 亿行,每天插入约 200 万行新行。我在每个分区的 CUST_DIVISION 列上创建了一个本地索引,希望 Oracle 在我的查询中使用该索引。但是,当我运行查询时,Oracle 执行全表扫描而不是使用索引。

CREATE INDEX IDX_CUST_DIVISION_1 ON "KTC"."SHARED_RAW_RE_GL78" (CUST_DIVISION)
LOCAL
(
    PARTITION MONTHID_01,
    PARTITION MONTHID_02,
    PARTITION MONTHID_03,
    PARTITION MONTHID_04,
    PARTITION MONTHID_05,
    PARTITION MONTHID_06,
    PARTITION MONTHID_07,
    PARTITION MONTHID_08,
    PARTITION MONTHID_09,
    PARTITION MONTHID_10,
    PARTITION MONTHID_11,
    PARTITION MONTHID_12
);
----the query-----
SELECT GL_CODE, SUM(NET_LCY) 
FROM 
(
  SELECT GL_CODE, NET_LCY 
  FROM "KTC"."SHARED_RAW_RE_GL78"
  WHERE MONTHID=202408 AND CUST_DIVISION = 'KHCN'
) a
GROUP BY GL_CODE;

这是我的代码执行计划

身份证 操作 姓名 字节 成本(CPU) 时间 开始 停止
0 选择语句 279 7533 665K (1) 00:00:27
1 哈希分组依据 279 7533 665K (1) 00:00:27
2 分区列表单 59M 1520M 664K (1) 00:00:26 8 8
3 桌子访问已满 SHARED_RAW_RE_GL78 59M 1520M 664K (1) 00:00:26 8 8

从这个执行计划可以清楚地看出,Oracle 正在对分区 8 执行全表扫描,即使查询按 MONTHID(分区键)和 CUST_DIVISION(索引列)进行筛选。我希望它使用 CUST_DIVISION 上的本地索引。

  1. 为什么 Oracle 忽略 CUST_DIVISION 上的本地索引?
  2. 优化器更喜欢全表是否有特定原因 在这种情况下扫描吗?
  3. 是否有任何优化器提示或调整可能会迫使 Oracle 使用索引?

任何有关如何改进此索引策略的建议将不胜感激!谢谢!

sql oracle-database indexing
1个回答
0
投票

使用分区名称使其更快

选择 GL_CODE,SUM(NET_LCY) 从 ( 选择 GL_CODE、NET_LCY 来自“KTC”。“SHARED_RAW_RE_GL78”分区(MONTHID_08) WHERE CUST_DIVISION = 'KHCN' ) 一个 按 GL_CODE 分组;

© www.soinside.com 2019 - 2024. All rights reserved.