暂无图片
暂无图片
3
暂无图片
暂无图片
暂无图片

Oracle 关于date 字段索引使用测试

原创 布衣&凡尘 2022-07-21
2988

背景:

今天看到一个问答,发现个知识点,于是做了个简单的测试,希望有所帮助。
image.png

准备数据

SQL> create table t1 (id number,t_date date); SQL>insert into t1 values(1,to_date('2022-01-11','yyyy-mm-dd')); SQL>insert into t1 values(2,to_date('2022-02-11','yyyy-mm-dd')); SQL>insert into t1 values(3,to_date('2022-03-11','yyyy-mm-dd')); SQL>insert into t1 values(4,to_date('2022-04-11','yyyy-mm-dd')); SQL>insert into t1 values(5,to_date('2022-05-11','yyyy-mm-dd')); SQL>insert into t1 values(6,to_date('2022-06-11','yyyy-mm-dd')); SQL>insert into t1 values(7,to_date('2022-07-11','yyyy-mm-dd')); SQL>insert into t1 values(8,to_date('2022-08-11','yyyy-mm-dd')); SQL>insert into t1 values(9,to_date('2022-09-11','yyyy-mm-dd')); SQL>insert into t1 values(10,to_date('2022-10-11','yyyy-mm-dd')); SQL>insert into t1 values(11,to_date('2022-11-11','yyyy-mm-dd')); SQL>insert into t1 values(12,to_date('2022-12-11','yyyy-mm-dd')); SQL> commit; SQL> create index t_date_ind on t1 (t_date);

一、to_date 格式不同,影响查询是否走索引

1、未使用索引: where t_date=to_date(‘2022-03-11’,‘yyyy-mm-dd’);
SQL> Select * from t1 where t_date=to_date('2022-03-11','yyyy-mm-dd'); ID T_DATE ---------- ------------------ 3 11-MAR-22 Execution Plan ---------------------------------------------------------- Plan hash value: 3617692013 -------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 22 | 2 (0)| 00:00:01 | |* 1 | TABLE ACCESS FULL| T1 | 1 | 22 | 2 (0)| 00:00:01 | -------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("T_DATE"=TO_DATE(' 2022-03-11 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))
2、使用索引: where t_date=to_date(‘2022-03-11’,‘yyyy-mm-dd hh24:mi:ss’);
SQL> Select * from t1 where t_date=to_date('2022-03-11','yyyy-mm-dd hh24:mi:ss'); ID T_DATE ---------- ------------------ 3 11-MAR-22 Execution Plan ---------------------------------------------------------- Plan hash value: 4277157620 ------------------------------------------------------------------------------------------ | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | 1 | 22 | 2 (0)| 00:00:01 | | 1 | TABLE ACCESS BY INDEX ROWID| T1 | 1 | 22 | 2 (0)| 00:00:01 | |* 2 | INDEX RANGE SCAN | T_DATE_IND | 1 | | 1 (0)| 00:00:01 | ------------------------------------------------------------------------------------------ Predicate Information (identified by operation id): --------------------------------------------------- 2 - access("T_DATE"=TO_DATE('2022-03-11','yyyy-mm-dd hh24:mi:ss'))

二、数据量在全表数据的10%以上,有可能走的是全表扫描,而不走索引。

1)查询结果在全表数据的10% : 未走索引
SQL> Select * from t1 where t_date>to_date('2022-03-11','yyyy-mm-dd hh24:mi:ss'); ID T_DATE ---------- ------------------ 4 11-APR-22 5 11-MAY-22 6 11-JUN-22 7 11-JUL-22 8 11-AUG-22 9 11-SEP-22 10 11-OCT-22 11 11-NOV-22 12 11-DEC-22 9 rows selected. Execution Plan ---------------------------------------------------------- Plan hash value: 3617692013 -------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 9 | 198 | 2 (0)| 00:00:01 | |* 1 | TABLE ACCESS FULL| T1 | 9 | 198 | 2 (0)| 00:00:01 | -------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("T_DATE">TO_DATE('2022-03-11','yyyy-mm-dd hh24:mi:ss'))
2)查询结果未达到全表数据的10%:走索引
SQL> Select * from t1 where t_date>to_date('2022-11-11','yyyy-mm-dd hh24:mi:ss'); ID T_DATE ---------- ------------------ 12 11-DEC-22 Execution Plan ---------------------------------------------------------- Plan hash value: 4277157620 ------------------------------------------------------------------------------------------ | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | 1 | 22 | 2 (0)| 00:00:01 | | 1 | TABLE ACCESS BY INDEX ROWID| T1 | 1 | 22 | 2 (0)| 00:00:01 | |* 2 | INDEX RANGE SCAN | T_DATE_IND | 1 | | 1 (0)| 00:00:01 | ------------------------------------------------------------------------------------------ Predicate Information (identified by operation id): --------------------------------------------------- 2 - access("T_DATE">TO_DATE('2022-11-11','yyyy-mm-dd hh24:mi:ss'))

三、对字段进行类型转换,不会走索引

SQL> Select * from t1 where to_char(t_date,'yyyy-mm-dd hh24:mi:ss')='2022-03-11 00:00:00'; ID T_DATE ---------- ------------------ 3 11-MAR-22 Execution Plan ---------------------------------------------------------- Plan hash value: 3617692013 -------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 22 | 2 (0)| 00:00:01 | |* 1 | TABLE ACCESS FULL| T1 | 1 | 22 | 2 (0)| 00:00:01 | -------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter(TO_CHAR(INTERNAL_FUNCTION("T_DATE"),'yyyy-mm-dd hh24:mi:ss')='2022-03-11 00:00:00')

文档下载:

《Oracle Date 字段索引使用测试.dbf》文档下载https://www.modb.pro/doc/72521
《PL/Java.pdf》文档下载:https://www.modb.pro/doc/70867
《GP的资源队列.pdf》文档下载:https://www.modb.pro/doc/67644
《Greenplum psql客户端免交互执行SQL.pdf》https://www.modb.pro/doc/69806
《Oracle 自动收集统计信息机制》:https://www.modb.pro/db/403670
《Oracle_索引重建—优化索引碎片》:https://www.modb.pro/db/399543
《DBA_TAB_MODIFICATIONS表的刷新策略测试》https://www.modb.pro/db/414692

                    欢迎点赞支持或留言指正

最后修改时间:2022-07-21 10:06:04
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论