我在 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 上的本地索引。
任何有关如何改进此索引策略的建议将不胜感激!谢谢!
使用分区名称使其更快
选择 GL_CODE,SUM(NET_LCY) 从 ( 选择 GL_CODE、NET_LCY 来自“KTC”。“SHARED_RAW_RE_GL78”分区(MONTHID_08) WHERE CUST_DIVISION = 'KHCN' ) 一个 按 GL_CODE 分组;