index ffs、index fs原理考究-1109
h2 { margin-top: 0.46cm; margin-bottom: 0.46cm; direction: ltr; line-height: 173%; text-align: justify; page-break-inside: avoid }
h2.western { font-family: "Cambria", serif; font-size: 16pt }
h2.cjk { font-family: "宋体"; font-size: 16pt }
h2.ctl { font-size: 16pt }
h1 { margin-top: 0.6cm; margin-bottom: 0.58cm; direction: ltr; line-height: 241%; text-align: justify; page-break-inside: avoid }
h1.western { font-family: "Calibri", serif; font-size: 22pt }
p { margin-bottom: 0.25cm; direction: ltr; line-height: 120%; text-align: justify }
a:link { color: rgb(0, 0, 255) }
1.创建测试表
SQL>
CREATE TABLE TEST AS SELECT * FROM dba_objects WHERE 0=1;
2.创建测试索引
SQL>
CREATE INDEX ind_test_id ON TEST(object_id);
3.插入测试数据
SQL>
INSERT INTO TEST SELECT * FROM dba_objects WHERE
object_id IS NOT NULL AND object_id > 10000 ORDER BY object_id
DESC;
17837
rows created.
4.分析表
附带索引等等
SQL>
analyze table test compute statistics for table for all columns for
all indexes;
Table
analyzed.
5.打开执行计划
SQL>
set autotrace trace;
6.FFS示例
SQL>
select object_id from test;
17837
rows selected.
Execution
Plan
----------------------------------------------------------
0
SELECT STATEMENT Optimizer=CHOOSE (Cost=68 Card=17837
Bytes=71348)
1
0 TABLE ACCESS (FULL) OF 'TEST' (Cost=68 Card=17837 Bytes=71348)
这时候
Oracle会选择全表扫描,因为
object_id
列默认是可以为null的,来修改成
not null
6.1修改字段属性
not null
SQL>alter
table test modify(object_id not null);
6.2再次验证
FFS
SQL>
select object_id from test;
17837
rows selected.
Execution
Plan
----------------------------------------------------------
0
SELECT STATEMENT Optimizer=CHOOSE (Cost=11 Card=17837
Bytes=71348)
1
0 INDEX (FAST FULL SCAN) OF 'IND_TEST_ID' (NON-UNIQUE) (Cost=11
Card=17837 Bytes=71348)
没有问题
7. IFS
示例
SQL>
select/*+ index(test ind_TEST_ID)*/ object_id from test;
17837
rows selected.
Execution
Plan
----------------------------------------------------------
0
SELECT STATEMENT Optimizer=CHOOSE (Cost=41 Card=17837
Bytes=71348)
1
0 INDEX (FULL SCAN) OF 'IND_TEST_ID' (NON-UNIQUE) (Cost=101
Card=17837 Bytes=71348)
没有问题
我们看到了两者都可以在这种情况下使用,那么他们有什么区别呢?有个地方可以看出两者的区别,
来看一下两者的输出结果,为了让大家看清楚一点,我们只取10行。
8结果验证
SQL>
set arraysize 1000;
SQL>
alter system flush buffer_cache; ----一定要刷新,不然观察不到
db file sequential
read
SQL>
alter system flush shared_pool;
SQL>
alter session set events '10046 trace name context forever, level 8';
8.1FFS(INDEX
FAST FULL SCAN)
SQL>
select object_id from test where rownum<11;
OBJECT_ID
----------
66266
66267
66268
66269
66270
66271
66272
66273
66274
66275
10
rows selected.
SQL>
alter session set events '10046 trace name context off';
检查该索引所属文件号、段头快
SQL>
select owner,header_file,header_block from dba_segments where
segment_name='IND_TEST_ID';
OWNER
HEADER_FILE HEADER_BLOCK
------------------------------
----------- ------------
OWNER
4 3562
段头块为
3562,后退一个即
索引的 root block
3563
SQL>
set arraysize 1000;
SQL>
alter system flush buffer_cache; ----一定要刷新,不然观察不到
db file sequential
read
SQL>
alter system flush shared_pool;
SQL>
alter session set events '10046 trace name context forever, level 8';
以下内容取自
10046 event trace文件
|
===================== PARSING select END PARSE EXEC WAIT WAIT WAIT WAIT WAIT WAIT FETCH WAIT WAIT FETCH STAT STAT WAIT *** 结论:FFS会读取 最开始扫描的是3562,它是索引的段头,并且是单块读(注意:段头都是单块读),然后才是从3563 |
8.2FS(INDEX
FULL SCAN)
SQL>
set arraysize 1000;
SQL>
alter system flush buffer_cache; ----一定要刷新,不然观察不到
db file sequential
read
SQL>
alter system flush shared_pool;
SQL>
alter session set events '10046 trace name context forever, level 8';
SQL>
select/*+ index(test ind_TEST_ID)*/ object_id from test where
rownum<11;
OBJECT_ID
----------
10616
12177
12178
12179
12301
13495
13536
13539
13923
16503
10
rows selected.
SQL>
alter session set events '10046 trace name context off';
以下内容取自
10046 event trace文件
|
===================== PARSING select/*+ END PARSE EXEC WAIT WAIT WAIT FETCH WAIT WAIT FETCH STAT STAT WAIT *** 结论:这个索引的段头块是3562,root |
结论:两者的结果完全不一样,这是为什么呢?
|
这是因为当进行index 而进行index |
9.原因考证
归纳:
|
索引类别 |
访问方式 |
是否排序 |
|
FFS |
先扫描 segment |
多一步 sort |
|
FS |
不扫描 segment |
自动的执行 sort |
详情
|
为什么 为什么 |
index ffs、index fs原理考究-1109的更多相关文章
- 【从翻译mos文章】采用高速全扫描索引(index ffs) 为了避免全表扫描
采用高速全扫描索引(index ffs) 为了避免全表扫描 参考原始: Index Fast Full Scan Usage To Avoid Full Table Scans (Doc ID 701 ...
- index index.html index.htm index.php
server { listen 80; server_name localhost; index index.html index.htm index.php;#前后顺序有关系,越在前优先级别越高 r ...
- nginx -t "nginx: [warn] only the last index in "index" directive should be absolute in 6 "的问题解决
修改完nginx的配置文件之后,执行nginx -t命令提示"nginx: [warn] only the last index in "index" directive ...
- 14.8.11 Physical Structure of an InnoDB Index InnoDB Index 的物理结构
14.8.11 Physical Structure of an InnoDB Index InnoDB Index 的物理结构 所有的InnoDB indexes 是 B-trees Index r ...
- 14.2.5.4 Physical Structure of an InnoDB Index InnoDB Index 的物理结构
14.2.5.4 Physical Structure of an InnoDB Index InnoDB Index 的物理结构 所有的InnoDB indexes 是B-trees ,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这四者的区别 ...
- [Oacle][Partition]Partition操作与 Index, Global Index 的关系
[Oacle][Partition]Partition操作与 Index, Global Index 的关系: ■ Regarding the local index and the global i ...
- C 缓冲区过读 if (index >= 0 && index < len)
C 缓冲区过读 if (index >= 0 && index < len) CWE - CWE-126: Buffer Over-read (3.2) http://cw ...
- Sql Server中的表访问方式Table Scan, Index Scan, Index Seek
1.oracle中的表访问方式 在oracle中有表访问方式的说法,访问表中的数据主要通过三种方式进行访问: 全表扫描(full table scan),直接访问数据页,查找满足条件的数据 通过row ...
随机推荐
- leetcode面试准备:Count Complete Tree Nodes
1 题目 Given a complete binary tree, count the number of nodes. In a complete binary tree every level, ...
- Fragment 常见问题
1. 因为Fragment是在3.0提出的,为了兼容低版本,需要引入一个android-support-v4.jar 2. 需要实例化的activity必须 extends FragmentActiv ...
- Spark使用CombineTextInputFormat缓解小文件过多导致Task数目过多的问题
目前平台使用Kafka + Flume的方式进行实时数据接入,Kafka中的数据由业务方负责写入,这些数据一部分由Spark Streaming进行流式计算:另一部分数据则经由Flume存储至HDFS ...
- IOS7官方推荐图标和图像尺寸
图标和图像大小 每一个应用程序需要一个应用程序图标和启动图像.此外,一些应用程序需要自定义的图标来表示特定于应用程序的内容,功能,或在导航栏,工具栏和标签栏模式. 不像其他的定制艺术品在您的应用程序的 ...
- Oracle数据库12560及更改密码为永久
小厂子的程序员还要折腾Oracle维护.这这里简单记录一下Oracle数据库服务器使用时遇到并解决的一些问题. 1. 在Oracle数据库服务器上(即安装Oracle数据库端的机器上),可以使用命令 ...
- Nodejs负载均衡:haproxy,slb以及node-slb - i5ting的个人空间 - 开源中国社区
Nodejs负载均衡:haproxy,slb以及node-slb - i5ting的个人空间 - 开源中国社区 undefined
- win8.1 无法安装 net framework3.5的解决办法
近期给重装系统时,发现Windows8.1无法安装.net framework 3.5,即使我离线下载了安装文件,还要求安装2.0和3.0....而且无法从Windows更新中获取,因此百度到以下方案 ...
- 410. Split Array Largest Sum
做了Zenefits的OA,比面经里的简单多了..害我担心好久 阴险的Baidu啊,完全没想到用二分,一开始感觉要用DP,类似于极小极大值的做法. 然后看了答案也写了他妈好久. 思路是再不看M的情况下 ...
- stickyListHeaders框架的使用
最近在Demo中使用到了stickyListHeaders框架实现悬停效果 比较好用 在xml中 <se.emilsjolander.stickylistheaders.StickyListHe ...
- 你的Jsp页面有黄×么,有黄色问号么?Multiple annotations found at this line: - Invalid location of tag (form). - No
jsp页面有黄色问号代表我们的html标签不符合规范 对于很多人拿到页面美工给的页面,有时候很多都有黄色的问号. 为什么会这样呢? Multiple annotations found at this ...