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,如需转载请自行联系原作者
相关文章
|
Oracle 关系型数据库 Linux
【YashanDB 知识库】通过 dblink 查询 Oracle 数据时报 YAS-07301 异常
客户在使用 YashanDB 通过 yasql 查询 Oracle 数据时,遇到 `YAS-07301 external module timeout` 异常,导致 dblink 功能无法正常使用,影响所有 YashanDB 版本。原因是操作系统资源紧张,无法 fork 新子进程。解决方法包括释放内存、停掉不必要的进程或增大进程数上限。分析发现异常源于 system() 函数调用失败,返回 -1,通常是因为 fork() 失败。未来 YashanDB 将优化日志信息以更好地诊断类似问题。
|
12月前
|
Oracle 关系型数据库 数据库
【赵渝强老师】Oracle的闪回版本查询
本文介绍了Oracle数据库的闪回版本查询(Flashback Version Query)功能,通过示例详细讲解了其使用方法。闪回版本查询可获取指定时间区间内行的不同版本,利用`versions between`子句实现。文中包含视频讲解,并通过创建测试表、插入数据及执行查询等步骤,演示如何获取历史版本信息和伪列详情,帮助用户深入了解该功能的实际应用。
269 13
|
11月前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的闪回事务查询
Oracle数据库的闪回事务查询(Flashback Transaction Query)是闪回版本查询的扩充,可用于审计或撤销已提交的事务。通过`flashback_transaction_query`视图,可生成还原特定事务的SQL语句。本文介绍了其基本概念,并通过实战演示如何使用该功能:从授权、开启UNDO数据增强,到创建测试表和事务,最后利用闪回查询撤销已提交的事务,验证数据恢复效果。附带视频讲解,帮助深入理解。
305 3
|
12月前
|
Oracle 关系型数据库 Linux
【YashanDB知识库】通过dblink查询Oracle数据时报YAS-07301异常
【YashanDB知识库】通过dblink查询Oracle数据时报YAS-07301异常
|
12月前
|
Oracle 关系型数据库 MySQL
【YashanDB知识库】oracle dblink varchar类型查询报错记录
这篇文章主要介绍了 Oracle DBLINK 查询崖山 DB 报错的相关内容,包括 ODBC 安装配置、数据源配置、dblink 环境配置、问题原因分析及规避方法。问题原因是 dblink 连接其他数据库时 varchar 类型转换导致的,还介绍了 long 类型限制、char 等类型区别,规避方法是修改参数 MAX_STRING_SIZE 支持 32K。
|
Oracle 关系型数据库 Linux
【YashanDB 知识库】通过 dblink 查询 Oracle 数据时报 YAS-07301 异常
某客户在使用 YashanDB 通过 yasql 查询 Oracle 数据时,遇到 `YAS-07301 external module timeout` 异常,导致 dblink 功能无法正常使用,影响所有版本。问题源于操作系统资源紧张,无法 fork 新子进程。解决方法包括释放内存、停掉不必要的进程或增大进程数上限。分析发现异常原因为系统调用 fork() 失败。经验总结:优化日志记录,提供更多异常信息。
|
Oracle 关系型数据库 数据库
【YashanDB知识库】oracle dblink varchar类型查询报错记录
在使用Oracle DBLink查询VARCHAR类型数据时,可能会遇到多种报错。通过了解常见错误原因,采取合适的解决方法,可以有效避免和处理这些错误。希望本文提供的分析和示例能帮助你在实际工作中更好地处理DBLink查询问题。
426 10
|
SQL Oracle 关系型数据库
如何在 Oracle 中配置和使用 SQL Profiles 来优化查询性能?
在 Oracle 数据库中,SQL Profiles 是优化查询性能的工具,通过提供额外统计信息帮助生成更有效的执行计划。配置和使用步骤包括:1. 启用自动 SQL 调优;2. 手动创建 SQL Profile,涉及收集、执行调优任务、查看报告及应用建议;3. 验证效果;4. 使用 `DBA_SQL_PROFILES` 视图管理 Profile。
|
Oracle 关系型数据库 数据处理
|
SQL 监控 Oracle

推荐镜像

更多