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 ...
随机推荐
- jQuery&HTML&CSS3实现垂直手风琴折叠菜单方法讲解
在网页制作中我们常常需要折叠式的菜单,在折叠菜单中,手风琴特效的菜单是非常受欢迎,下面就讲解使用jQuery+HTML+CSS3实现垂直手风琴折叠菜单的方法. jQuery实现垂直手风琴折叠菜单示例代 ...
- HDwiki文件上传导致远程代码执行漏洞
漏洞版本: HDwiki(2011) 漏洞描述: 互动维客开源系统(HDwiki)作为中国第一家拥有自主知识产权的中文维基(Wiki)系统,由互动在线(北京)科技有限公司于2006 年11月28日正式 ...
- Linux Shell编程(30)——别名
Bash别名本质上是一个简称, 缩写, 这可避免键入过长的命令序列. 例如,如果我们添加 alias lm="ls -l | more" 这一行到文件~/.bashrc file里 ...
- Web Service和ISAPI的区别与联系 转
Web Service和ISAPI的区别与联系 1.Web Service 是一种新的web应用程序分支,他们是自包含.自描述.模块化的应用,可以发布.定位.通过web调用.Web Service ...
- 【转】VSync Count 垂直同步
原文:http://blog.csdn.net/yesy10/article/details/7794556 Unity3D中新建一个场景空的时候,帧速率(FPS总是很低),大概在60~70之间.一直 ...
- BlogEngine.Net
BlogEngine.Net架构与源代码分析系列part1:开篇介绍 2008-11-05 15:27 by GUO Xingwang, ...阅读, ...评论, 收藏, 编辑 最近我要开始这个系列 ...
- mipi 调试经验
转载自http://blog.csdn.net/g_salamander/article/details/9163455 以下是最近几个月在调试 MIPI DSI / CSI 的一些经验总结,因为协议 ...
- c++异常安全和copy and swap策略
异常安全有两个目标: 不泄露任何资源.这个通过RAII可以做到. 不破坏数据结构.这是下文要讨论的事情 异常安全有三个级别: 基本安全:异常发生后对象和数据结构还有合法状态.实现简单,应该作为最低要求 ...
- CSS 属性 - 伪类和伪元素
CSS 伪类用于向某些选择器添加特殊的效果. CSS 伪元素用于将特殊的效果添加到某些选择器. 可以明确两点,第一两者都与选择器相关,第二就是添加一些“特殊”的效果.这里特殊指的是两者描述了其他 cs ...
- Debug调试
1.F5单步调试进入函数内部 2.F6单步调试进行下一步 3.F7由函数内部返回到调用用处 4.F8一直执行到下一个断点