全局索引添加后查询未走索引

【 使用环境 】 测试环境
【 OB or 其他组件 】OB
【 使用版本 】4.2.1.11
【问题描述】有张表table,按照cust_01(用户编号)分了7个区(Hash),现在需要分页查询然后order by DT_01 desc降序排列。我们现在使用CREATE INDEX IDX_INLV_DT_01 ON table(DT_01) GLOBAL创建了全局索引,但是看执行计划似乎没有走索引。然后我创建了一个局部索引,同样的sql语句就可以走索引查询。
具体的SQL语句:
SELECT * FROM (
SELECT TMP_PAGE.*, ROWNUM AS ROW_ID FROM table (
SELECT PK_01, FK_01, AMT_01, DT_01, DT_02, ORG_01, OPR_01, AMT_02, AMT_03, AMT_04, AMT_05, AMT_06, AMT_07, AMT_08, AMT_09, AMT_10, AMT_11, AMT_12, AMT_13, AMT_14, TAG_01, IDNT_01_NO, IDNT_01_TYP, CUST_01, CUST_02, TAG_02, ORG_02, OPR_02, FK_02
FROM lc_indv_lmt_view WHERE FK_01 = ‘000’ ORDER BY DT_01 DESC
) TMP_PAGE WHERE ROWNUM <= 10
) WHERE ROW_ID > 0;
添加索引使用了两种方式:
1、CREATE INDEX IDX_INLV_DT_01 ON table(DT_01) GLOBAL ;
2、CREATE INDEX IDX_INLV_DT_01 ON table(DT_01) GLOBAL
PARTITION BY RANGE (“DT_01”) (
PARTITION P0 VALUES LESS THAN (DATE ‘1966-12-31’),
PARTITION P1 VALUES LESS THAN (DATE ‘1984-12-31’),
PARTITION P3 VALUES LESS THAN (DATE ‘9808-12-31’)
);
想问一下,全局索引为什么没生效而局部索引可以使用?如果想要加全局索引,该怎么添加呢?
【复现路径】无
【附件及日志】推荐使用OceanBase敏捷诊断工具obdiag收集诊断信息,详情参见链接(右键跳转查看):

【SOP系列 22 】——故障诊断第一步(自助诊断和诊断信息收集)
@论坛小助手

3 个赞

针对您的问题,我们可以通过 obdiag 工具来收集 SQL 相关的日志和执行计划,以便进一步分析为什么全局索引没有生效。以下是具体的日志采集场景和命令:

日志采集场景: SQL性能问题
日志采集命令: obdiag gather scene run --scene=observer.perf_sql --env “{db_connect=’-h127.0.0.1 -P2881 -utest@test -p****** -Dtest’, trace_id=‘Yxx’}”

请您执行上述命令,并将采集到的日志提供给我们,以便我们进一步分析问题所在。

另外,为了更好地了解您的问题并提供更准确的帮助,我们需要您提供以下信息:

  1. 创建全局索引的具体 SQL 语句是什么?
  2. 指定 SQL 语句的具体内容是什么?
  3. 您是否已经检查过该 SQL 语句的执行计划?如果是,请提供执行计划的相关信息。
  4. 您是否尝试过重建全局索引或优化表结构?如果有,请提供相关操作的详细步骤。
  5. 是否有其他类似的全局索引也遇到了相同的问题?

希望以上信息可以帮助我们更快地找到问题的原因并提供解决方案。感谢您的配合!

附上敏捷诊断工具 obdiag 使用帮助链接

使用obdiag 分别取一下这两个情况下的执行计划
https://www.oceanbase.com/docs/common-obdiag-cn-1000000005357969
obdiag gather plan_monitor --trace_id YB420BA2D99B-0005EBBFC45D5A00-0-0
–env host=xx.xx.xx.xx --env port=2881 --env user=root@test --env password=*** --env database=test

两个索引都是全局索引
前者是非分区全局索引,后者是分区全局索引,全局索引,同global参数相关
前者可以使用explain 查看,是否走了其他索引

现在就是CREATE INDEX IDX_INLV_DT_01 ON table(DT_01) LOCAL ;可以正常,但是全局索引就不走索引

学习了

666

1 个赞

神人

非常好

这个语句没走 CREATE INDEX IDX_INLV_DT_01 ON table(DT_01) GLOBAL 不是很正常吗。。都没有用DT_01字段作为过滤条件,lc_indv_lmt_view是个视图吧,除非这里用了DT_01字段过滤

不是视图,表名就是这样。虽然过滤条件没有,但是Order BY是有DT_01作为条件的