执行计划中常见index访问方式(转)
近期有朋友对于单个表上的index各种情况比较模糊,这里对于单个表上,单个index出现的大多数情况进行了总结性测试,给出了测试结果,至于为什么出现这样的试验结果未做过多解释,给读者留下思考的空间.本篇文章仅仅是为了测试hint对index的影响,而不是说明走各种index方式的好坏.参考: INDEX FULL SCAN vs INDEX FAST FULL SCAN
创建表模拟测试
SQL> create table t_xifenfei as select object_id,object_name from dba_objects;Table created.SQL> create index i_t_object_id on t_xifenfei(object_id); Index created.SQL> exec dbms_stats.gather_table_stats(USER,'T_XIFENFEI',cascade=>true); PL/SQL procedure successfully completed.SQL> desc t_xifenfei Name Null? Type ----------------------------------------- -------- ---------------------------- OBJECT_ID NUMBER OBJECT_NAME VARCHAR2(128) |
TABLE ACCESS FULL
SQL> SET AUTOT TRACE EXP STATSQL> SELECT OBJECT_ID FROM T_XIFENFEI;49838 rows selected.Execution Plan----------------------------------------------------------Plan hash value: 548923532--------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |--------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 49838 | 243K| 57 (2)| 00:00:01 || 1 | TABLE ACCESS FULL| T_XIFENFEI | 49838 | 243K| 57 (2)| 00:00:01 |--------------------------------------------------------------------------------Statistics---------------------------------------------------------- 1 recursive calls 0 db block gets 3544 consistent gets 0 physical reads 0 redo size 721203 bytes sent via SQL*Net to client 36927 bytes received via SQL*Net from client 3324 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 49838 rows processedSQL> SELECT /*+ INDEX(T i_t_object_id) */ OBJECT_ID FROM T_XIFENFEI;49838 rows selected.Execution Plan----------------------------------------------------------Plan hash value: 548923532--------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |--------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 49838 | 243K| 57 (2)| 00:00:01 || 1 | TABLE ACCESS FULL| T_XIFENFEI | 49838 | 243K| 57 (2)| 00:00:01 |--------------------------------------------------------------------------------Statistics---------------------------------------------------------- 1 recursive calls 0 db block gets 3544 consistent gets 0 physical reads 0 redo size 721203 bytes sent via SQL*Net to client 36927 bytes received via SQL*Net from client 3324 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 49838 rows processed |
从上面的执行计划中可知,此时走了全表扫描. 由于我们需要查询的列为object_id,因此理论上只需要读取索引就应该可以返回所有数据,而此时为什么是全表扫描呢? 这是因为NULL值与索引的特性所决定的.即null值不会被存储到B树索引.因此应该为表 t_xifenfei 的列 object_id 添加 not null 约束.
INDEX FAST FULL SCAN
SQL> alter table t_xifenfei modify(object_id not null); Table altered.SQL> SELECT object_id from t_xifenfei;49838 rows selected.Execution Plan----------------------------------------------------------Plan hash value: 2036340805--------------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |--------------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 49838 | 243K| 27 (4)| 00:00:01 || 1 | INDEX FAST FULL SCAN| I_T_OBJECT_ID | 49838 | 243K| 27 (4)| 00:00:01 |--------------------------------------------------------------------------------------Statistics---------------------------------------------------------- 1 recursive calls 0 db block gets 3432 consistent gets 0 physical reads 0 redo size 721203 bytes sent via SQL*Net to client 36927 bytes received via SQL*Net from client 3324 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 49838 rows processed |
INDEX FAST FULL SCAN:当在高速缓存中没有找到所需的索引块时,则根据db_file_multiblock_read_count的值进行多块读操作.对于索引的分支结构只是简单的获取,然后扫描所有的叶结点.其结果是导致索引结构没有访问,获取的数据没有根据索引键的顺序排序.INDEX FAST FULL SCAN使用multiblock_read,故产生db file scattered reads 事件.
INDEX RANGE SCAN
SQL> select object_id from t_xifenfei where object_id<10;8 rows selected.Execution Plan----------------------------------------------------------Plan hash value: 2197008162----------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |----------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 2 | 10 | 2 (0)| 00:00:01 ||* 1 | INDEX RANGE SCAN| I_T_OBJECT_ID | 2 | 10 | 2 (0)| 00:00:01 |----------------------------------------------------------------------------------Predicate Information (identified by operation id):--------------------------------------------------- 1 - access("OBJECT_ID"<10)Statistics---------------------------------------------------------- 1 recursive calls 0 db block gets 3 consistent gets 0 physical reads 0 redo size 499 bytes sent via SQL*Net to client 385 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 8 rows processedSQL> select /*+ index_ffs(t i_t_object_id) */ object_id from t_xifenfei t where object_id<10;8 rows selected.Execution Plan----------------------------------------------------------Plan hash value: 2036340805--------------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |--------------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 2 | 10 | 27 (4)| 00:00:01 ||* 1 | INDEX FAST FULL SCAN| I_T_OBJECT_ID | 2 | 10 | 27 (4)| 00:00:01 |--------------------------------------------------------------------------------------Predicate Information (identified by operation id):--------------------------------------------------- 1 - filter("OBJECT_ID"<10)Statistics---------------------------------------------------------- 1 recursive calls 0 db block gets 118 consistent gets 0 physical reads 0 redo size 499 bytes sent via SQL*Net to client 385 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 8 rows processed1这里可以看出index_ffs已经生效,但是对于这样的情况hint index_ffs效率一般来说不会太高.<br><strong>INDEX FULL SCAN</strong>1SQL> SELECT /*+ INDEX(T i_t_object_id) */ object_id from t_xifenfei t;49838 rows selected.Execution Plan----------------------------------------------------------Plan hash value: 431110666----------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |----------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 49838 | 243K| 113 (2)| 00:00:02 || 1 | INDEX FULL SCAN | I_T_OBJECT_ID | 49838 | 243K| 113 (2)| 00:00:02 |----------------------------------------------------------------------------------Statistics---------------------------------------------------------- 1 recursive calls 0 db block gets 3426 consistent gets 0 physical reads 0 redo size 721203 bytes sent via SQL*Net to client 36927 bytes received via SQL*Net from client 3324 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 49838 rows processed |
INDEX FULL SCAN:完全按照索引存储的顺序依次访问整个索引树.当访问到叶结点之后,按照双向链表方式读取相连节点的值.换言之,对于索引上所有的数据是按照有序的方式来读取的.如果索引块没有在高速缓存中被找到时,则需要从数据文件中单块进行读取.对于需要读取大量数据的全索引扫描而言,这将使其变得低效.INDEX FULL SCAN使用single read,故产生db file sequential reads事件.新版的Oracle支持db file parallel reads方式.
HINT INDEX不会使用INDEX FAST FULL SCAN功能.
INDEX列ORDER BY
SQL> SELECT OBJECT_ID FROM T_XIFENFEI order by object_id ;49838 rows selected.Execution Plan----------------------------------------------------------Plan hash value: 431110666----------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |----------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 49838 | 243K| 113 (2)| 00:00:02 || 1 | INDEX FULL SCAN | I_T_OBJECT_ID | 49838 | 243K| 113 (2)| 00:00:02 |----------------------------------------------------------------------------------Statistics---------------------------------------------------------- 1 recursive calls 0 db block gets 3426 consistent gets 0 physical reads 0 redo size 721203 bytes sent via SQL*Net to client 36927 bytes received via SQL*Net from client 3324 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 49838 rows processedSQL> SELECT OBJECT_ID FROM T_XIFENFEI order by object_id desc;49838 rows selected.Execution Plan----------------------------------------------------------Plan hash value: 2808014233--------------------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |--------------------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 49838 | 243K| 113 (2)| 00:00:02 || 1 | INDEX FULL SCAN DESCENDING| I_T_OBJECT_ID | 49838 | 243K| 113 (2)| 00:00:02 |--------------------------------------------------------------------------------------------Statistics---------------------------------------------------------- 1 recursive calls 0 db block gets 3427 consistent gets 0 physical reads 0 redo size 721203 bytes sent via SQL*Net to client 36927 bytes received via SQL*Net from client 3324 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 49838 rows processedSQL> SELECT /*+ index_ffs(t i_t_object_id) */ object_id from t_xifenfei t order by object_id;49838 rows selected.Execution Plan----------------------------------------------------------Plan hash value: 2527678987-----------------------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |-----------------------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 49838 | 243K| | 185 (4)| 00:00:03 || 1 | SORT ORDER BY | | 49838 | 243K| 1192K| 185 (4)| 00:00:03 || 2 | INDEX FAST FULL SCAN| I_T_OBJECT_ID | 49838 | 243K| | 27 (4)| 00:00:01 |-----------------------------------------------------------------------------------------------Statistics---------------------------------------------------------- 1 recursive calls 0 db block gets 117 consistent gets 0 physical reads 0 redo size 721203 bytes sent via SQL*Net to client 36927 bytes received via SQL*Net from client 3324 SQL*Net roundtrips to/from client 1 sorts (memory) 0 sorts (disk) 49838 rows processed |
对于index 列排序,默认情况下会使用INDEX FULL SCAN/INDEX FULL SCAN DESCENDING而不选择使用INDEX FAST FULL SCAN,因为INDEX FAST FULL SCAN获得数据后,还需要做一次SORT ORDER BY操作
INDEX FAST FULL SCAN+SORT AGGREGATE
SQL> SELECT count(object_id) FROM T_XIFENFEI;Execution Plan----------------------------------------------------------Plan hash value: 3095383276-------------------------------------------------------------------------------| Id | Operation | Name | Rows | Cost (%CPU)| Time |-------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 1 | 27 (4)| 00:00:01 || 1 | SORT AGGREGATE | | 1 | | || 2 | INDEX FAST FULL SCAN| I_T_OBJECT_ID | 49838 | 27 (4)| 00:00:01 |-------------------------------------------------------------------------------Statistics---------------------------------------------------------- 1 recursive calls 0 db block gets 117 consistent gets 0 physical reads 0 redo size 421 bytes sent via SQL*Net to client 385 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 1 rows processedSQL> SELECT /*+ INDEX(T i_t_object_id) */ count(object_id) FROM T_XIFENFEI t;Execution Plan----------------------------------------------------------Plan hash value: 3079973526--------------------------------------------------------------------------| Id | Operation | Name | Rows | Cost (%CPU)| Time |--------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 1 | 113 (2)| 00:00:02 || 1 | SORT AGGREGATE | | 1 | | || 2 | INDEX FULL SCAN| I_T_OBJECT_ID | 49838 | 113 (2)| 00:00:02 |--------------------------------------------------------------------------Statistics---------------------------------------------------------- 1 recursive calls 0 db block gets 111 consistent gets 0 physical reads 0 redo size 421 bytes sent via SQL*Net to client 385 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 1 rows processed |
sort aggregate通常发生在使用一些聚合函数的时候,sum(),avg(),min(),max(),count()等等,实际上sort aggregate不做真正的sort,并不会用到排序空间,而是通过一个全局变量+全表或全索引扫描来实现.这样的操作在默认情况下使用INDEX FAST FULL SCAN
INDEX FULL SCAN (MIN/MAX)
SQL> SELECT max(object_id) FROM T_XIFENFEI;Execution Plan----------------------------------------------------------Plan hash value: 2939893782--------------------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |--------------------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 1 | 5 | 2 (0)| 00:00:01 || 1 | SORT AGGREGATE | | 1 | 5 | | || 2 | INDEX FULL SCAN (MIN/MAX)| I_T_OBJECT_ID | 49838 | 243K| 2 (0)| 00:00:01 |--------------------------------------------------------------------------------------------Statistics---------------------------------------------------------- 1 recursive calls 0 db block gets 2 consistent gets 0 physical reads 0 redo size 419 bytes sent via SQL*Net to client 385 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 1 rows processedSQL> SELECT /*+ index_ffs(t i_t_object_id) */ max(object_id) FROM T_XIFENFEI t;Execution Plan----------------------------------------------------------Plan hash value: 2939893782--------------------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |--------------------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 1 | 5 | 27 (4)| 00:00:01 || 1 | SORT AGGREGATE | | 1 | 5 | | || 2 | INDEX FULL SCAN (MIN/MAX)| I_T_OBJECT_ID | 49838 | 243K| 27 (4)| 00:00:01 |--------------------------------------------------------------------------------------------Statistics---------------------------------------------------------- 1 recursive calls 0 db block gets 2 consistent gets 0 physical reads 0 redo size 419 bytes sent via SQL*Net to client 385 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 1 rows processed |
对于这样的查询INDEX FULL SCAN (MIN/MAX)明显是最优,但是此处奇怪的是使用了index_ffs提示无效,如果有知道的朋友,麻烦告知原因.
http://www.xifenfei.com/2968.html
执行计划中常见index访问方式(转)的更多相关文章
- MySQL 执行计划中Extra(Using where,Using index,Using index condition,Using index,Using where)的浅析
关于如何理解MySQL执行计划中Extra列的Using where.Using Index.Using index condition,Using index,Using where这四者的区别 ...
- Sql Server中的表访问方式Table Scan, Index Scan, Index Seek
1.oracle中的表访问方式 在oracle中有表访问方式的说法,访问表中的数据主要通过三种方式进行访问: 全表扫描(full table scan),直接访问数据页,查找满足条件的数据 通过row ...
- 转:Sql Server中的表访问方式Table Scan, Index Scan, Index Seek
0.参考文献 Table Scan, Index Scan, Index Seek SQL SERVER – Index Seek vs. Index Scan – Diffefence and Us ...
- SQL Server 执行计划中的扫描方式举例说明
SQL Server 执行计划中的扫描方式举例说明 原文地址:http://www.cnblogs.com/zihunqingxin/p/3201155.html 1.执行计划使用方式 选中需要执行的 ...
- [转载] EXPLAIN执行计划中要重点关注哪些要素
原文: https://mp.weixin.qq.com/s?__biz=MjM5NzAzMTY4NQ==&mid=400738936&idx=1&sn=2910b4119b9 ...
- EXPLAIN执行计划中要重点关注哪些要素(叶金荣)
原文:http://mp.weixin.qq.com/s/CDKN_nPcIjzA_U5-xwAE5w 导读 EXPLAIN的结果中,有哪些关键信息值得注意呢? MySQL的EXPLAIN当然和ORA ...
- EXPLAIN执行计划中要重点关注哪些要素
MySQL的EXPLAIN当然和ORACLE的没法比,不过我们从它输出的结果中,也可以得到很多有用的信息. 总的来说,我们只需要关注结果中的几列: 列名 备注 type 本次查询表联接类型,从这里可以 ...
- EXPLAIN执行计划中要重点关注哪些要素(转)
EXPLAIN的结果中,有哪些关键信息值得注意呢? MySQL的EXPLAIN当然和ORACLE的没法比,不过我们从它输出的结果中,也可以得到很多有用的信息. 总的来说,我们只需要关注结果中的几列: ...
- SQL Server 2000中的并行处理和执行计划中的位图运算符
SQL Server 2000中的并行处理和执行计划中的位图运算符 摘抄自:SQLServer 2000并行处理和位图简介 刘志斌 并行查询介绍Degree of Parallelism(并行度) 一 ...
随机推荐
- NSNotificationCenter消息机制的介绍
转载自http://www.cnblogs.com/pengyingh/articles/2367374.html NSNotificationCenter的作用是专门提供程序中不同类之间的消息通讯而 ...
- 如何学习一门新技术-iOS开发
如何快速学习一门新技术 以CoreBluetooth 蓝牙开发为例.我们可以从官方获得的资源有:SampleCode, Documentation,API Reference. 先从Documenta ...
- Linux 关闭及重启方式
一.shutdown 命令 作用:关闭或重启系统 使用权限:超级管理员使用 常用选项 1. -r 关机后立即重启 2. -h关机后不重启 3. -f快速关机,重启时跳过fsck(file system ...
- GET和POST本质上有什么区别
如果有人问你,GET和POST,有什么区别?你会如何回答? 我的经历 前几天有人问我这个问题.我说GET是用于获取数据的,POST,一般用于将数据发给服务器之用. 这个答案好像并不是他想要的.于是他继 ...
- javascript动画效果
之前工作项目中,运用了缓动动画的效果,在网上看到其他大牛写的相关公式,结合工作需要,进行了整理,拿出来跟大家分享下,js代码中,只运用了一个小功能进行了测试 <!DOCTYPE html> ...
- asp.net模态窗口返回值
个人感觉模态窗口在做网站的时候,使用到的比较少,前段时间在做项目时要实现以模态窗口传值和接收返回值, 模态窗口传值实现比较简单,但是做好后发现在Chrome浏览器中接收不到返回值,修改好Chrome浏 ...
- 完全卸载oracle
今天在网上看到有位网友写的篇日志,感觉蛮好的,一般卸载oracle有4个地方需求注意:1)Services,2)software,3eventlog,4)path. 1.关闭 oracle 所有的服务 ...
- 在treeview外加一个滚动条的实现
前台代码: <div style="overflow:auto;width:190px;height:280px;border:1px solid #336699;padding-le ...
- exp/imp 有很多弊端
弊端1. 空表 无法执行导出操作弊端2. 高版本的导出文件 无法使用 低版本的 oracle软件 导入 环境准备:create table test0707(n1 date); 认证弊端1 案例1. ...
- svn的初级使用
首先呢 你需要下载一个软件 比如说是 Cornerstone. 进行安装好之后 然后 然后输入账号密码 就可以了 然后去xcode去进行相关的配置 点击第二个进入 偏好设置 点击最下边的+ 点击第二 ...