oracle在组合索引上,只使用部分列进行查询(查询时必须包含前导列,否则会走全表扫描)

简介:

实验环境:Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

1、创建表插入数据

1
2
3
4
5
6
7
8
9
SQL>  create  table  txtx(id  int , name  char (2),tx  char (3),id1  int , primary  key (id, name ,tx));
表已创建。
SQL>  insert  into  txtx  values (1, 'tx' , 'tx' ,1);
已创建 1 行。
SQL>  insert  into  txtx  values (2, 'tx' , 'tx' ,2);
已创建 1 行。
SQL>  insert  into  txtx  values (3, 'tx' , 'tx' ,3);
已创建 1 行。
SQL>  commit ;
1
2
3
4
5
6
SQL>  select  from  txtx;
         ID NA TX         ID1
---------- -- --- ----------
          1 tx tx           1
          2 tx tx           2
          3 tx tx           3

2、执行计划

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SQL> explain plan  for  select  from  txtx   where  id=1  and  id1 =1  and  tx= 'tx' ;
已解释。
SQL>  set  linesize 200
SQL>  select  from  table (DBMS_XPLAN.DISPLAY);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 4191381592
--------------------------------------------------------------------------
| Id  | Operation         |  Name  Rows   | Bytes | Cost (%CPU)|  Time      |
--------------------------------------------------------------------------
|   0 |  SELECT  STATEMENT  |      |     1 |    35 |     3   (0)| 00:00:01 |
|*  1 |   TABLE  ACCESS  FULL | TXTX |     1 |    35 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------
Predicate Information (identified  by  operation id):
---------------------------------------------------
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    1 - filter( "ID" =1  AND  "ID1" =1  AND  "TX" = 'tx' )
Note
-----
    dynamic  sampling used  for  this statement ( level =2)
已选择17行。

通过以上执行计划,可以看出,不含前导列,进行了全表扫描,以下使用了前导列,查询速度就上来了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SQL> explain plan  for  select  from  txtx   where  id=1  and  name  = 'tx'  and  tx= 'tx' ;
已解释。
SQL>  select  from  table (DBMS_XPLAN.DISPLAY);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 913771524
--------------------------------------------------------------------------------------------
| Id  | Operation                   |  Name          Rows   | Bytes | Cost (%CPU)|  Time      |
--------------------------------------------------------------------------------------------
|   0 |  SELECT  STATEMENT            |              |     1 |    35 |     1   (0)| 00:00:01 |
|   1 |   TABLE  ACCESS  BY  INDEX  ROWID| TXTX         |     1 |    35 |     1   (0)| 00:00:01 |
|*  2 |    INDEX  UNIQUE  SCAN         | SYS_C0024000 |     1 |       |     1   (0)| 00:00:01 |
--------------------------------------------------------------------------------------------
Predicate Information (identified  by  operation id):
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------
    2 - access( "ID" =1  AND  "NAME" = 'tx'  AND  "TX" = 'tx' )
已选择14行。



本文转自 corasql 51CTO博客,原文链接:http://blog.51cto.com/corasql/1913521,如需转载请自行联系原作者
相关文章
|
3月前
|
SQL Oracle 关系型数据库
Oracle查询优化-查询只包含数字或字母的数据
【2月更文挑战第4天】【2月更文挑战第10篇】查询只包含数字或字母的数据
110 1
|
4月前
|
SQL Oracle 关系型数据库
Oracle-index索引解读
Oracle-index索引解读
77 0
|
4月前
|
SQL Oracle 关系型数据库
JAVAEE框架数据库技术之12_oracle常用函数和高级查询子查询
JAVAEE框架数据库技术之12_oracle常用函数和高级查询子查询
69 0
JAVAEE框架数据库技术之12_oracle常用函数和高级查询子查询
|
14天前
|
分布式计算 DataWorks 关系型数据库
DataWorks产品使用合集之在 DataWorks 中,使用Oracle作为数据源进行数据映射和查询,如何更改数据源为MaxCompute或其他类型
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
28 1
|
18天前
|
存储 Oracle 关系型数据库
Oracle索引知识看这一篇就足够
Oracle索引知识看这一篇就足够
|
25天前
|
存储 Oracle 关系型数据库
Oracle 12c的多重索引:数据的“多维导航仪”
【4月更文挑战第19天】Oracle 12c的多重索引提升数据查询效率,如同多维导航仪。在同一表上创建针对不同列的多个索引,加速检索过程。虽然过多索引会增加存储和维护成本,但合理选择和使用索引策略,结合位图、函数索引等高级特性,能优化查询,应对复杂场景。数据管理员应善用这些工具,根据需求进行索引管理,支持企业数据分析。
|
2月前
|
SQL Oracle 关系型数据库
Oracle系列之八:SQL查询
Oracle系列之八:SQL查询
|
6月前
|
索引
Oracle-序列、索引和同义词
Oracle-序列、索引和同义词
27 0
|
6月前
|
SQL Oracle 关系型数据库
Oracle 代码异常查询(九)
Oracle 代码异常查询
178 0
|
3月前
|
Oracle 关系型数据库
Oracle 递归查询
Oracle 递归查询
11 0