INDEX FULL SCAN和INDEX FAST FULL SCAN的区别
2019独角兽企业重金招聘Python工程师标准>>>
关于INDEX FULL SCAN和INDEX FAST FULL SCAN的区别在于,前者在对索引进行扫描的时候会考虑大索引的结构,而且会按照索引的排序,
而后者则不会,INDEX FAST FULL SCAN不会去扫描根块和分支块,对索引像访问堆表一样访问,所以这两个扫描方式用在不同的场合
如果存在ORDER BY这样的排序,INDEX FULL SCAN是合适的,如果不需要排序,那INDEX FAST FULL SCAN效率是更高的。
试验如下:
SQL> drop table t;
Table dropped
SQL>
SQL> CREATE TABLE t (
2 id NUMBER,
3 n1 NUMBER,
4 n2 NUMBER,
5 pad VARCHAR2(4000),
6 CONSTRAINT t_pk PRIMARY KEY (id)
7 );
Table created
SQL> execute dbms_random.seed(0)
PL/SQL procedure successfully completed
SQL> INSERT INTO t
2 SELECT rownum AS id,
3 1+mod(rownum,251) AS n1,
4 1+mod(rownum,251) AS n2,
5 dbms_random.string('p',255) AS pad
6 FROM dual
7 CONNECT BY level <= 10000
8 ORDER BY dbms_random.value;
10000 rows inserted
SQL> CREATE INDEX t_n1_i ON t (n1);
Index created
SQL>
SQL> BEGIN
2 dbms_stats.gather_table_stats(
3 ownname => user,
4 tabname => 'T',
5 estimate_percent => 100,
6 method_opt => 'for all columns size skewonly',
7 cascade => TRUE
8 );
9 END;
10 /
PL/SQL procedure successfully completed
建立试验环境完成
一、语句需要排序的情况
1、使用INDEX FULL SCAN
SQL> explain plan for
2 SELECT /*+ index(t t_n1_i) gather_plan_statistics */
3 n1
4 FROM t
5 WHERE n1 IS NOT NULL
6 ORDER BY n1;
Explained
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 1041622781
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 10000 | 40000 | 27 (19)| 00:00:01 |
|* 1 | INDEX FULL SCAN | T_N1_I | 10000 | 40000 | 27 (19)| 00:00:01 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("N1" IS NOT NULL)
13 rows selected
可以看到这里执行计划并没有SORT出现
2、强制使用INDEX FAST FULL SCAN
SQL> explain plan for
2 SELECT /*+ index_ffs(t t_n1_i) */ n1 FROM t WHERE n1 IS NOT NULL order by n1;
Explained
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 3958789139
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Ti
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 10000 | 40000 | | 45 (36)| 00
| 1 | SORT ORDER BY | | 10000 | 40000 | 248K| 45 (36)| 00
|* 2 | INDEX FAST FULL SCAN| T_N1_I | 10000 | 40000 | | 7 (43)| 00
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("N1" IS NOT NULL)
14 rows selected
可以清楚的看到这里出现SORT,大量的COST出现在SORT这里,
所以排序的情况INDEX FULL SCAN优于INDEX FAST FULL SCAN。
二、没有排序的情况
我们只需要去掉最后ORDER BY 就OK了
1、使用INDEX FULL SCAN
SQL> explain plan for
2 SELECT /*+ index(t t_n1_i) */ n1 FROM t WHERE n1 IS NOT NULL;
Explained
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 1041622781
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 10000 | 40000 | 27 (19)| 00:00:01 |
|* 1 | INDEX FULL SCAN | T_N1_I | 10000 | 40000 | 27 (19)| 00:00:01 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("N1" IS NOT NULL)
13 rows selected
可以看到这里根本没有变化,所以排序与否(ASC,如果是DESC会稍有变化)对执行计划没有影响
2、使用INDEX FAST FULL SCAN
SQL> explain plan for
2 SELECT /*+ index_ffs(t t_n1_i) */ n1 FROM t WHERE n1 IS NOT NULL;
Explained
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 263832501
-------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 10000 | 40000 | 7 (43)| 00:00:01 |
|* 1 | INDEX FAST FULL SCAN| T_N1_I | 10000 | 40000 | 7 (43)| 00:00:01 |
-------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("N1" IS NOT NULL)
13 rows selected
没有出现SORT代价小了很多。
所以证明了我所说的。
转载于:https://my.oschina.net/sniperLi/blog/357251
INDEX FULL SCAN和INDEX FAST FULL SCAN的区别相关推荐
- INDEX FULL SCAN和INDEX FAST FULL SCAN区别
---请记住这个INDEX FULL SCAN扫描方式,并体会与INDEX FAST FULL SCAN的区别 drop table t purge; create table t as select ...
- 为什么不走INDEX FAST FULL SCAN呢
INDEX FULL SCAN 索引全扫描.单块读 .它扫描的结果是有序的,因为索引是有序的.它通常发生在 下面几种情况(注意:即使SQL满足以下情况 不一定会走索引全扫描)1. SQL语句有orde ...
- INDEX FULL SCAN vs INDEX FAST FULL SCAN
INDEX FULL SCAN 与 INDEX FAST FULL SCAN两个长相差不多,乃是一母同胞,因此既有其共性,也有其个性.两者来说其共性是不用扫描表而是通过索引就可以直接返回所需要的所有数 ...
- 关于index fast full scan 和 index full scan
先说下两个重要的等待事件: 1.db file sequential read ---大多数情况下,读索引块或通过索引读取一个数据块,会记录这个等待,单块读 2.db file scattere ...
- Oracle之执行计划index fullscan和index fast full scan区别
1.当select和where中出现的列都存在索引是发生index full scan与index fast full scan的前提 2.查询返回的数据行总数占据整个索引10%以上的比率 3.基于上 ...
- 一次fast full scan的调优
1.闲着无聊在客户一套较为重要的系统中提取了一个4天的AWR,发现下面这条SQL产生最多的物理读,四天运行了159次.平均每次物理读1G左右.SQL运行时间三分钟左右. SQL: SELECT DEC ...
- oracle index alter,Oracle alter index rebuild 一系列问题
在ITPUB 论坛上看到的一个帖子,很不错.根据论坛的帖子重做整理了一下. 原文链接如下: alter index rebuild online引发的血案 一. 官网说明 在MOS 上的一篇文章讲 ...
- python中index函数_python中index函数的用法
原博文 2019-08-28 15:23 − a = "I will never kiss a guy." b = a.index("kiss") print( ...
- java scan hbase_hbase+java实例,Scan查询所有、get根据rowkey查询一行或一列数据
hbase+java实例,Scan查询所有.get根据rowkey查询一行或一列数据 import java.io.IOException; import java.text.SimpleDateFo ...
最新文章
- JS实现的表单验证和强大的×××
- 《思科UCS服务器统一计算》一导读
- 【CI】CN.一种多尺度协同变异的微粒群优化算法
- 高级考题_理论干货最最直观的词云分布,带你一次看清天大考题端倪!
- mysql 5.7 连接数_mysql5.7出现大量too many connections及too many open files错误,且配置最大连接数未生效...
- 校园信息发布平台网站源码
- 【软考信息系统项目管理师】必背重点之信息化和信息系统
- Vue :将头像/文本生成二维码
- [SHOI2015]激光发生器
- 软件测试:三角形问题
- 什么是CAD定位功能?CAD定位功能如何使用?
- 人工智能数学基础: 18-Haar矩阵的Kronecker积构造
- JS_画中画,video视频播放器
- 基于微信平台的电影购票系统设计与实现(程序+论文)
- ajax的跨域和请求——详解
- YOLOX升级 | 阿里巴巴提出YOLOX-PAI,1ms内精度无敌,超越YOLOv6、PP-YOLOE
- php字符串转数组函数,PHP字符串转数组和数组转字符串函数讲解
- 超级应用程序的图标设计系统
- mysql 证书双向认证_https证书双向验证
- VMware 12 安装 OS X 10.11.6 El Capitan 时提示:OS X 未能安装在您的电脑上
热门文章
- FreeBSD从零开始---Web服务器搭建(一)
- 变量相关命令(env,export,set,read, array, declare)
- 把用户体验设计放到底层逻辑架构设计的前面去做
- AngularJS转换请求内容
- [微信开发] 开发指南笔记
- css3 box-sizing:border-box 实现div一行多列
- [BZOJ 2002][Hnoi2010]Bounce 弹飞绵羊(分块)
- 【原创】腾讯微博的XSS攻击漏洞
- [转载] 淘宝旺铺扶植版如何添加背景音乐
- 设置cisco登录时显示的警示性信息-banner