SQL Tuning 基础概述10 - 体会索引的常见执行计划
在《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 - 体会索引的常见执行计划的更多相关文章
- SQL Tuning 基础概述10
在<SQL Tuning 基础概述05 - Oracle 索引类型及介绍>的1.5小节,提到了几种"索引的常见执行计划": INDEX FULL SCAN:索引的全扫描 ...
- SQL Tuning 基础概述05 - Oracle 索引类型及介绍
一.B-Tree索引 三大特点:高度较低.存储列值.结构有序 1.1利用索引特性进行优化 外键上建立索引:不但可以提升查询效率,而且可以有效避免锁的竞争(外键所在表delete记录未提交,主键所在表会 ...
- SQL Tuning 基础概述08 - SQL Tuning Advisor
SQL调优顾问 SQL Tuning Advisor的使用案例: 1.构建测试表T 2.定义调整任务 3.修改调整任务参数 4.执行调整任务 5.监控调整任务 6.查看调整任务建议 7.删除调整任务 ...
- SQL Tuning 基础概述09 - SQL Access Advisor
Oracle官方文档对SQL Access Advisor的描述如下: SQL Access Advisor, which is a tuning tool that provides advice ...
- SQL Tuning 基础概述03 - 使用sql_trace和10046事件跟踪执行计划
1.使用sql_trace跟踪执行计划 1.1 当前session跟踪: alter session set sql_trace = true; //开始sql_trace alter session ...
- SQL Tuning 基础概述01 - Autotrace的设定
1.autotrace的设定 SQL> set autotrace Usage: SET AUTOT[RACE] {OFF | ON | TRACE[ONLY]} [EXP[LAIN]] [ST ...
- SQL Tuning 基础概述02 - Explain plan的使用
1.explain plan的使用 SQL> explain plan for delete from t_jingyu; Explained. SQL> select * from ta ...
- SQL Tuning 基础概述06 - 表的关联方式:Nested Loops Join,Merge Sort Join & Hash Join
nested loops join(嵌套循环) 驱动表返回几条结果集,被驱动表访问多少次,有驱动顺序,无须排序,无任何限制. 驱动表限制条件有索引,被驱动表连接条件有索引. hints:use_n ...
- SQL Tuning 基础概述04 - Oracle 表的类型及介绍
Tables A table describes an entity such as employees. You define a table with a table name, such as ...
随机推荐
- JAVA逻辑运算符
逻辑运算符,用于链接boolean类型的表达式. AND与 (&)OR或 (|)XOR异或 (^)Not非 (!)AND双与短路 (&&)OR双与短路 (||) 与(& ...
- 如何使用Babel将ES6转码为ES5?
一.前言: 当我们还在沉迷于ES5的时候,殊不知ES6早就已经发布几年了.时代在进步,WEB前端技术也在日新月异,是时候做些改变了! ECMAScript 6(ES6)的发展速度非常之快,但现代浏览器 ...
- 传输控制协议TCP
TCP主要特点: (1)面向连接 (2)只能是点到点 (3)可靠的传输协议 (4)全双工通信,各自各自的读写缓冲区,应用层吧数据交给发送缓冲区,tcp合适就发送了,接受的时候tcp写入接受缓冲区,应用 ...
- jquery与ajax的XMLHttpRequest对象介绍
首先 认识一个对象 这个对象叫XMLHttpRequest XMLHttpRequest对象可以提供在不刷新页面的情况下向服务器发送异步请求,并且接受服务器端返回的结果.从而实现局部更新当前页面的功 ...
- STL中sort排序算法第三个参数_Compare的实现本质
关于C++ STL vector 中的sort排序算法有三种自定义实现,它们本质上都是返回bool类型,提供给sort函数作为第三个参数. 重载运算符 全局的比较函数 函数对象 我认为从实现方式看,重 ...
- devexpress控件layoutview特效之一旋转木马的实现
1.devexpress有很多很好的特效,最近做了个旋转木马的特效,给大家分享下.效果图如下: 2.这里的控件为gridcontrol,里面的view为layoutview.数据绑定的代码与其他gri ...
- 走进javascript——不起眼的基础,值和分号
值 有时我很想知道javascript解析引擎是如何区分一个变量的值,比如下面这段代码. var x = 'javascript'; //javascript x = "hello" ...
- 智能打印SDK-源码剖析
开源地址:http://www.dnnode.com/ 软件下载地址:http://www.dnnode.com/在线展示:http://www.dnnode.com/help.html 前面的文章, ...
- WEB中调用Nutch执行JOB抓取
参考:在Eclipse中运行Nutch 把nutch的源代码导入到eclipse工程自定义抓取任务. 下载源码: http://svn.apache.org/repos/asf/nutch/ 从svn ...
- 规范 : 过程 : login cookies sessionTimeOut
规范 用户登入网站将得到一个cookies,如果用户有2个account,各别登入admin page 和 client page,是会得到2个cookies. 在reload page时,后台会得到 ...