数据库教程:Oracle小于条件导致索引失效

ORACLE建索引的小发现基础索引建立创建一般索引创建唯一索引对订单表的ACCT_DATE进行查询:小于条件的执行计划: (小于等于执行计划与小于一样)SQL:执行计划:大于条件的执行计划: (大于等于执行计划与大于一样)SQL:执行计划:结论基础索引建立创建一般索引CREATE INDEX IDX_ORDER_TASK ON IC_GRANT_ORDER (ACCT_DATE ASC);推荐这种,如果需要唯一,可以单加一个唯一约束,这样以后改成非唯一只需要去除约束即可。创建唯一索引CREAT

ORACLE建索引的小发现

  • 基础索引建立
    • 创建一般索引:Non-Unique
    • 创建唯一索引:Unique
  • 对订单表的ACCT_DATE进行查询:
    • 执行计划
    • 小于条件的执行计划: (小于等于执行计划与小于一样)
      • SQL:
      • 执行计划:
    • 大于条件的执行计划: (大于等于执行计划与大于一样)
      • SQL:
      • 执行计划:
  • 结论

基础索引建立

创建一般索引:Non-Unique

CREATE INDEX IDX_ORDER_TASK ON IC_GRANT_ORDER (ACCT_DATE ASC); 

推荐这种,如果需要唯一,可以单加一个唯一约束,这样以后改成非唯一只需要去除约束即可。

创建唯一索引:Unique

CREATE UNIQUE INDEX IDX_ORDER_TASK ON IC_GRANT_ORDER (ACCT_DATE ASC); 

如果后期要改成非唯一索引,需要删除索引,重新建立

对订单表的ACCT_DATE进行查询:

执行计划

TABLE ACCESS FULL:全表扫描
INDEX RANGE SCAN :索引扫描
TABLE ACCESS BY INDEX ROWID:通过ROWID唯一索引查询
本次建立的是Non-Unique索引,底层会通过索引字段和ROWID组成联合索引,查询时会先查询索引字段,然后查询ROWID快速定位数据。

小于条件的执行计划: (小于等于执行计划与小于一样)

SQL:

explain plan for  select id from IC_GRANT_ORDER where ACCT_DATE<'20200601' and send_status='04'; SELECT * from table(dbms_xplan.display); 

执行计划:

Plan hash value: 3153622128   ------------------------------------------------------------------------------------ | Id  | Operation         | Name           | Rows  | Bytes | Cost (%CPU)| Time     | ------------------------------------------------------------------------------------ |   0 | SELECT STATEMENT  |                |     9 |   405 |   718   (1)| 00:00:09 | |*  1 |  TABLE ACCESS FULL| IC_GRANT_ORDER |     9 |   405 |   718   (1)| 00:00:09 | ------------------------------------------------------------------------------------   Predicate Information (identified by operation id): ---------------------------------------------------      1 - filter("SEND_STATUS"='04' AND "ACCT_DATE"<'20200601')   

大于条件的执行计划: (大于等于执行计划与大于一样)

SQL:

explain plan for  select id from IC_GRANT_ORDER where ACCT_DATE>'20200623' and send_status='04'; SELECT * from table(dbms_xplan.display);    

执行计划:

Plan hash value: 2309823823   ---------------------------------------------------------------------------------------------- | Id  | Operation                   | Name           | Rows  | Bytes | Cost (%CPU)| Time     | ---------------------------------------------------------------------------------------------- |   0 | SELECT STATEMENT            |                |     1 |    45 |     3   (0)| 00:00:01 | |*  1 |  TABLE ACCESS BY INDEX ROWID| IC_GRANT_ORDER |     1 |    45 |     3   (0)| 00:00:01 | |*  2 |   INDEX RANGE SCAN          | IDX_ORDER_TASK |     1 |       |     2   (0)| 00:00:01 | ----------------------------------------------------------------------------------------------   Predicate Information (identified by operation id): ---------------------------------------------------      1 - filter("SEND_STATUS"='04')    2 - access("ACCT_DATE">'20200623') 

结论

sql中的非唯一索引字段判断,如果是包含小于条件,会导致索引失效。大于和等于正常走索引。
小于失效的原因:根据执行计划可知,底层会将非唯一索引与rowid合为联合索引,因此,范围无法使用索引。但是大于为何有效?目前还没有搞清楚

数据库技术:Oracle小于条件导致索引失效地址:https://blog.csdn.net/qq_42282200/article/details/107313464

需要了解更多数据库技术:Oracle小于条件导致索引失效,都可以关注数据库技术分享栏目—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/dtteaching/629650.html

(0)
上一篇 2021年5月30日
下一篇 2021年5月30日

精彩推荐