在《SQL Tuning 基础概述05 - Oracle 索引类型及介绍》的1.5小节,提到了几种"索引的常见执行计划":

INDEX FULL SCAN:索引的全扫描,单块读,有序

INDEX RANGE SCAN:索引的范围扫描

INDEX FAST FULL SCAN:索引的快速全扫描,多块读,无序

INDEX FULL SCAN(MIN/MAX):针对MAX(),MIN()函数的查询

INDEX SKIP SCAN:查询条件没有用到组合索引的第一列,而组合索引的第一列重复度较高时,可能用到

本文用简单的测试案例,体会下索引使用这些执行计划的场景:

1.准备测试环境

创建测试表和索引:

conn jingyu/jingyu
drop table test_objects;
create table test_objects as select * from all_objects;
create index idx_test_objects_1 on test_objects(owner, object_name, subobject_name);
create index idx_test_objects_2 on test_objects(object_id);

查看测试表结构:

SQL> desc test_objects;
Name Null? Type
----------------------------------------------------------------- -------- --------------------------------------------
OWNER NOT NULL VARCHAR2(30)
OBJECT_NAME NOT NULL VARCHAR2(30)
SUBOBJECT_NAME VARCHAR2(30)
OBJECT_ID NOT NULL NUMBER
DATA_OBJECT_ID NUMBER
OBJECT_TYPE VARCHAR2(19)
CREATED NOT NULL DATE
LAST_DDL_TIME NOT NULL DATE
TIMESTAMP VARCHAR2(19)
STATUS VARCHAR2(7)
TEMPORARY VARCHAR2(1)
GENERATED VARCHAR2(1)
SECONDARY VARCHAR2(1)
NAMESPACE NOT NULL NUMBER
EDITION_NAME VARCHAR2(30)

查看测试表上的索引信息:

SQL> select index_name, column_name, column_position from user_ind_columns where table_name = 'TEST_OBJECTS';

INDEX_NAME                     COLUMN_NAME                              COLUMN_POSITION
------------------------------ ---------------------------------------- ---------------
IDX_TEST_OBJECTS_1 OWNER 1
IDX_TEST_OBJECTS_1 OBJECT_NAME 2
IDX_TEST_OBJECTS_1 SUBOBJECT_NAME 3
IDX_TEST_OBJECTS_2 OBJECT_ID 1

分析表并清空测试环境的shared_pool和buffer_cache:

analyze table test_objects compute statistics;
alter system flush shared_pool;
alter system flush buffer_cache;

2.编写SQL语句

根据不同执行计划的场景,编写SQL语句:

--INDEX RANGE SCAN(索引的范围扫描)
SELECT owner, object_name FROM test_objects WHERE owner = 'SYS' AND object_name = 'DBMS_OUTPUT'; --INDEX SKIP SCAN(针对MAX(),MIN()函数的查询)
SELECT owner, object_name FROM test_objects WHERE object_name = 'DBMS_OUTPUT'; --INDEX FAST FULL SCAN(索引的快速全扫描,多块读,无序)
SELECT owner, object_name FROM test_objects; --INDEX FULL SCAN(索引的全扫描,单块读,有序)
SELECT owner, object_name FROM test_objects order by 1, 2; --INDEX FULL SCAN (MIN/MAX)(针对MAX(),MIN()函数的查询)
SELECT max(object_id) FROM test_objects;

3.实验环境验证

根据2中的SQL分别在实验环境中验证,没有问题,结果如下:

SQL> set autot trace
--1. INDEX RANGE SCAN
SQL> SELECT owner, object_name FROM test_objects WHERE owner = 'SYS' AND object_name = 'DBMS_OUTPUT'; Execution Plan
----------------------------------------------------------
Plan hash value: 3492129186 ---------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 29 | 3 (0)| 00:00:01 |
|* 1 | INDEX RANGE SCAN| IDX_TEST_OBJECTS_1 | 1 | 29 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------------------- Predicate Information (identified by operation id):
--------------------------------------------------- 1 - access("OWNER"='SYS' AND "OBJECT_NAME"='DBMS_OUTPUT') Statistics
----------------------------------------------------------
59 recursive calls
0 db block gets
104 consistent gets
17 physical reads
0 redo size
676 bytes sent via SQL*Net to client
519 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
6 sorts (memory)
0 sorts (disk)
2 rows processed --2. INDEX SKIP SCAN
SQL> SELECT owner, object_name FROM test_objects WHERE object_name = 'DBMS_OUTPUT'; Execution Plan
----------------------------------------------------------
Plan hash value: 1228438998 ---------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 2 | 58 | 27 (0)| 00:00:01 |
|* 1 | INDEX SKIP SCAN | IDX_TEST_OBJECTS_1 | 2 | 58 | 27 (0)| 00:00:01 |
--------------------------------------------------------------------------------------- Predicate Information (identified by operation id):
--------------------------------------------------- 1 - access("OBJECT_NAME"='DBMS_OUTPUT')
filter("OBJECT_NAME"='DBMS_OUTPUT') Statistics
----------------------------------------------------------
2 recursive calls
0 db block gets
32 consistent gets
23 physical reads
0 redo size
684 bytes sent via SQL*Net to client
519 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
3 rows processed --3. INDEX FAST FULL SCAN
SQL> SELECT owner, object_name FROM test_objects; 84311 rows selected. Execution Plan
----------------------------------------------------------
Plan hash value: 2324984732 -------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 84311 | 2387K| 138 (0)| 00:00:02 |
| 1 | INDEX FAST FULL SCAN| IDX_TEST_OBJECTS_1 | 84311 | 2387K| 138 (0)| 00:00:02 |
------------------------------------------------------------------------------------------- Statistics
----------------------------------------------------------
1 recursive calls
0 db block gets
6097 consistent gets
480 physical reads
0 redo size
3509341 bytes sent via SQL*Net to client
62339 bytes received via SQL*Net from client
5622 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
84311 rows processed --4. INDEX FULL SCAN
SQL> SELECT owner, object_name FROM test_objects order by 1, 2; 84311 rows selected. Execution Plan
----------------------------------------------------------
Plan hash value: 2751381935 ---------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 84311 | 2387K| 505 (1)| 00:00:07 |
| 1 | INDEX FULL SCAN | IDX_TEST_OBJECTS_1 | 84311 | 2387K| 505 (1)| 00:00:07 |
--------------------------------------------------------------------------------------- Statistics
----------------------------------------------------------
1 recursive calls
0 db block gets
6090 consistent gets
0 physical reads
0 redo size
3509341 bytes sent via SQL*Net to client
62339 bytes received via SQL*Net from client
5622 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
84311 rows processed --5. INDEX FULL SCAN (MIN/MAX)
SQL> SELECT max(object_id) FROM test_objects; Execution Plan
----------------------------------------------------------
Plan hash value: 729623451 -------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 4 | 2 (0)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 4 | | |
| 2 | INDEX FULL SCAN (MIN/MAX)| IDX_TEST_OBJECTS_2 | 1 | 4 | 2 (0)| 00:00:01 |
------------------------------------------------------------------------------------------------- Statistics
----------------------------------------------------------
2 recursive calls
0 db block gets
5 consistent gets
2 physical reads
0 redo size
534 bytes sent via SQL*Net to client
519 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed

SQL Tuning 基础概述10 - 体会索引的常见执行计划的更多相关文章

  1. SQL Tuning 基础概述10

    在<SQL Tuning 基础概述05 - Oracle 索引类型及介绍>的1.5小节,提到了几种"索引的常见执行计划": INDEX FULL SCAN:索引的全扫描 ...

  2. SQL Tuning 基础概述05 - Oracle 索引类型及介绍

    一.B-Tree索引 三大特点:高度较低.存储列值.结构有序 1.1利用索引特性进行优化 外键上建立索引:不但可以提升查询效率,而且可以有效避免锁的竞争(外键所在表delete记录未提交,主键所在表会 ...

  3. SQL Tuning 基础概述08 - SQL Tuning Advisor

    SQL调优顾问 SQL Tuning Advisor的使用案例: 1.构建测试表T 2.定义调整任务 3.修改调整任务参数 4.执行调整任务 5.监控调整任务 6.查看调整任务建议 7.删除调整任务 ...

  4. SQL Tuning 基础概述09 - SQL Access Advisor

    Oracle官方文档对SQL Access Advisor的描述如下: SQL Access Advisor, which is a tuning tool that provides advice ...

  5. SQL Tuning 基础概述03 - 使用sql_trace和10046事件跟踪执行计划

    1.使用sql_trace跟踪执行计划 1.1 当前session跟踪: alter session set sql_trace = true; //开始sql_trace alter session ...

  6. SQL Tuning 基础概述01 - Autotrace的设定

    1.autotrace的设定 SQL> set autotrace Usage: SET AUTOT[RACE] {OFF | ON | TRACE[ONLY]} [EXP[LAIN]] [ST ...

  7. SQL Tuning 基础概述02 - Explain plan的使用

    1.explain plan的使用 SQL> explain plan for delete from t_jingyu; Explained. SQL> select * from ta ...

  8. SQL Tuning 基础概述06 - 表的关联方式:Nested Loops Join,Merge Sort Join & Hash Join

    nested loops join(嵌套循环)   驱动表返回几条结果集,被驱动表访问多少次,有驱动顺序,无须排序,无任何限制. 驱动表限制条件有索引,被驱动表连接条件有索引. hints:use_n ...

  9. SQL Tuning 基础概述04 - Oracle 表的类型及介绍

    Tables A table describes an entity such as employees. You define a table with a table name, such as ...

随机推荐

  1. ECMAScript 6 笔记(四)

    Symbol 1. 概述 ES6引入了一种新的原始数据类型Symbol,表示独一无二的值.它是JavaScript语言的第七种数据类型,前六种是:Undefined.Null.布尔值(Boolean) ...

  2. Professional C# 6 and .NET Core 1.0 - 38 Entity Framework Core

    本文内容为转载,重新排版以供学习研究.如有侵权,请联系作者删除. 转载请注明本文出处:Professional C# 6 and .NET Core 1.0 - 38 Entity Framework ...

  3. (原创)Java多线程作业题报java.lang.IllegalMonitorStateException解决

    作业: 有一个水池,水池容量500L,一边为进水口,一边为出水口,要求进水放水不能同时进行,水池一旦满了不能继续注水,一旦空了,不能继续放水,进水速度5L/s,放水速度2L/s. 这是我学多线程时做的 ...

  4. 下一个项目为什么要用 SLF4J

    阿里巴巴 Java 开发手册 前几天阿里巴巴在云栖社区首次公开阿里官方Java代码规范标准,就是一个PDF手册,有命名规范,让你知道自己原来取的每一个类名.变量名都是烂名字,真替你家未来孩子担心:有集 ...

  5. LINQ查询表达式和LAMBDA点标记方法基础

    在上一篇文章中,我们介绍了LINQ的一些基本用法,这一篇我们来看下另一种更简洁更优雅的表达式,Lambda表达式,也可以叫做点标记方法. 相信大家在实际工作中都用到过这两种方式,下面我们还是用实例来看 ...

  6. jQuery动态生成不规则表格前后端

    一.需求:有这么一张表 前四个属性当作联合主键 需要把该表所有的行在前端以表格形式显示出来,要求activityId相同时合并成一行,activityCode相同时,合并一行,activityVers ...

  7. JVM垃圾收集(GC)算法

    判断对象是否已死 1. 引用计数算法 给对象中添加一个引用计数器,每当一个地方引用它时,计数器值就加1:当引用失败时,计数器值就减1:任何时刻计数器为0的对象就是不能再被使用的. 主流的Java虚拟机 ...

  8. php小测试,难点与分享

    B/S(网页程序) 网页结构,依托游览器 C/S(客户端程序) 单引号和双引号包含字符串的区别: 双引号里面可以解析变量,比如: $a=555; echo "你好{$a}"; 输出 ...

  9. xcode升级到8.1

    一.JPush集成: 1. xcode7在iOS10以上的真机上运行接收不到通知的问题,把xcode升级到8.1,在build phases -> link binary with librar ...

  10. Java第三天

    0.注释: 目的:方便其他人阅读理解我们的代码 三种: // 单行注释,进行解释 /**/ 多行注释 /***/ 多行注释 (/***/注释通常用于方法,函数注释,在调用写好的方法或是函数时可以通过点 ...