为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:7
【操作系统】:window
【CPU】:
【问题描述】*:关于分区表创建,查询未使用索引问题
现有 一张表 ,分区 字段为 OCCUR_TIME
此表上建了 OCCUR_TIME 索引
CREATE INDEX "IND_EMS_HIS_RL_YX_WARN_PAR" ON "TH_ROBOT"."EMS_HIS_RL_YX_WARN"("OCCUR_TIME" DESC) STORAGE(ON "TH_ROBOT", CLUSTERBTR) ;
查看 一个 sql 的执行计划
select
yx_id ,
occur_time,
bay_id ,
fac_id ,
ems_station_name ,
customized_group ,
ems_bay_name ,
content ,
restrain_flag ,
status ,
if_display ,
resp_area
from
TH_ROBOT.EMS_HIS_RL_YX_WARN
where
OCCUR_TIME >= to_date('2022-06-01 00:00:00','yyyy-MM-dd HH24:mi:ss')
and OCCUR_TIME < to_date('2022-06-28 00:00:00','yyyy-MM-dd HH24:mi:ss')
and areano = '330600'
发现走的还是全表扫描
请问要 查询要如何使用索引
最后发现这个现象
当查询数据范围数据量小的时候,会走索引
数据量大的时候,不走索引
1 occur_time列是分区键,一般是不需要建索引的
例子中,表是按月分区,查询是整个6月的数据,刚好是一个分区,所以本例根本不用建occur_time列的索引
2 areano值,在一个分区内有没有很好的过滤性,即分组看下分布情况 select areano,count(*) ,如果330600值占比很小,可以建个areano字段的分区本地索引,否则不用建索引
CREATE INDEX “IND_EMS_HIS_RL_YX_WARN_PAR” ON “TH_ROBOT”.“EMS_HIS_RL_YX_WARN”(“OCCUR_TIME” DESC) GLOBAL STORAGE(ON “TH_ROBOT”, CLUSTERBTR) ;–加global关键字
时间范围改成between and 试试