Oracle索引扫描算法
- SQL> create table t as select * from dba_objects;
- Table created.
- SQL> create index idx_t on t(object_id);
- Index created.
- SQL> BEGIN
- 2 DBMS_STATS.GATHER_TABLE_STATS(ownname => 'TEST',
- 3 tabname => 'T',
- 4 estimate_percent => 100,
- 5 method_opt => 'for all columns size auto',
- 6 degree => DBMS_STATS.AUTO_DEGREE,
- 7 cascade => TRUE);
- 8 END;
- 9 /
- SQL> select leaf_blocks,blevel,clustering_factor from dba_indexes where index_name='IDX_T';
- LEAF_BLOCKS BLEVEL CLUSTERING_FACTOR
- ----------- ---------- -----------------
- 165 1 1705
- LEAF_BLOCKS 叶子块 165个
- BLEVEL 索引高度-1
- 集群因子;
- CLUSTERING_FACTOR =1705
- SQL> select count(distinct dbms_rowid.rowid_block_number(rowid)) from T;
- COUNT(DISTINCTDBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID))
- ---------------------------------------------------
- 1057
- 存储在1057个块中
- SQL> set linesize 200
- SQL> select b.num_rows,
- a.num_distinct,
- a.num_nulls,
- utl_raw.cast_to_number(high_value) high_value,
- utl_raw.cast_to_number(low_value) low_value,
- (b.num_rows - a.num_nulls) "NUM_ROWS-NUM_NULLS",
- utl_raw.cast_to_number(high_value) -
- utl_raw.cast_to_number(low_value) "HIGH_VALUE-LOW_VALUE"
- from dba_tab_col_statistics a, dba_tables b
- where a.owner = b.owner
- and a.table_name = b.table_name
- and a.owner = 'TEST'
- and a.table_name = upper('T')
- and a.column_name = 'OBJECT_ID'; 2 3 4 5 6 7 8 9 10 11 12 13 14
- NUM_ROWS NUM_DISTINCT NUM_NULLS HIGH_VALUE LOW_VALUE NUM_ROWS-NUM_NULLS HIGH_VALUE-LOW_VALUE
- ---------- ------------ ---------- ---------- ---------- ------------------ --------------------
- 74486 74486 0 77616 2 74486 77614
- SQL> explain plan for select owner from t where object_id<1000;
- Explained.
- SQL> select * from table(dbms_xplan.display());
- PLAN_TABLE_OUTPUT
- ------------------------------------------------------------------------------------------------------------------------------------------------------------
- --------------------------------------------
- Plan hash value: 1594971208
- -------------------------------------------------------------------------------------
- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
- -------------------------------------------------------------------------------------
- | 0 | SELECT STATEMENT | | 958 | 10538 | 26 (0)| 00:00:01 |
- | 1 | TABLE ACCESS BY INDEX ROWID| T | 958 | 10538 | 26 (0)| 00:00:01 |
- |* 2 | INDEX RANGE SCAN | IDX_T | 958 | | 4 (0)| 00:00:01 |
- -------------------------------------------------------------------------------------
- Predicate Information (identified by operation id):
- PLAN_TABLE_OUTPUT
- ------------------------------------------------------------------------------------------------------------------------------------------------------------
- --------------------------------------------
- ---------------------------------------------------
- 2 - access("OBJECT_ID"<1000)
- 14 rows selected.
- 索引扫描首先要定义到叶子块:
- 定位到叶子块 要扫描 多少个块??? 需要高度-1个块
- 叶子块个数 乘以 选择性
- 定位到叶子块 要扫描 多少个块???
- 回表和集群因子有关:
- 选择性(Selectivity) 列唯一键(Distinct_Keys) 与行数(Num_Rows)的比值。
- 这里有个概念叫有效选择性 ,< 的有效选择性为
- (limit-low_value)/(high_value-low_value)
- limit 是限制
- 1000
- low_value=2
- 1000-2 有可能扫到的值的范围
- high_value-low_value 表示总共有多少个值:
- HIGH_VALUE=77616
- LOW_VALUE=2
- HIGH_VALUE-LOW_VALUE=77614
- LEAF_BLOCKS=165
- 索引扫描的计算公式如下:
- cost =
- blevel +
- celiling(leaf_blocks *effective index selectivity) +
- celiling(clustering_factor * effective table selectivity)
- SQL> select 1+ceil(165*(1000-2)/77614)+ceil(1705*(1000-2)/77614) from dual;
- 1+CEIL(165*(1000-2)/77614)+CEIL(1705*(1000-2)/77614)
- ----------------------------------------------------
- 26
- 为啥effective table selectivity和effective index selectivity一样?
- 表和索引都包含指定列的数据 两者当然一样
Oracle索引扫描算法的更多相关文章
- Oracle索引扫描
Oracle索引扫描:先通过index查找到索引的值,并根据索引的值对应的rowid值(对于非唯一索引可能返回多个rowid值)直接从表中得到具体的数据.一个rowid唯一的表示一行数据,该行对应的数 ...
- Oracle 索引扫描的4种类型
根据索引的类型与where限制条件的不同,有4种类型的Oracle索引扫描: 3,4可归一种 (1) 索引唯一扫描(index uniquescan) (2) 索引范围扫描(index range s ...
- Oracle 索引扫描的五种类型
之前在讨论CBO和RBO的时候提到了索引扫描的几种类型. Oracle Optimizer CBO RBO http://blog.csdn.net/tianlesoftware/archive/20 ...
- oracle 索引扫描类型的分类与构造
1. INDEX RANGE SCAN--请记住这个INDEX RANGE SCAN扫描方式drop table t purge;create table t as select * from dba ...
- Oracle 索引扫描的几种情况
index range scan(索引范围扫描): 1.对于unique index来说,如果where 条件后面出现了<,> ,between ...and...的时候,那么就可能执行i ...
- Oracle索引梳理系列(八)- 索引扫描类型及分析(高效索引必备知识)
版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...
- oracle 基础知识(十四)----索引扫描
(1)索引唯一扫描(index unique scan) 通过唯一索引查找一个数值经常返回单个ROWID.如果该唯一索引有多个列组成(即组合索引),则至少要有组合索引的引导列参与到该查询中,如创建一个 ...
- Oracle 表的访问方式(2)-----索引扫描
索引扫描(Index scan) 我们先通过index查找到数据对应的rowid值(对于非唯一索引可能返回多个rowid值),然后根据rowid直接从表中得到具体的数据,这种查找方式称为索引扫描或索引 ...
- 关于ORACLE索引的几种扫描方式
------------恢复内容开始------------ ------------恢复内容开始------------ 一条sql执行的效率因执行计划的差异而影响,经常说这条sql走索引了,那条s ...
随机推荐
- optimizer hints
In version MySQL 5.7.7 Oracle presented a new promising feature: optimizer hints. However it did not ...
- Java基础知识强化之多线程笔记01:多线程基础知识(详见Android(java)笔记61~76)
1. 基础知识: Android(java)学习笔记61:多线程程序的引入 ~ Android(java)学习笔记76:多线程-定时器概述和使用
- nodejs开发环境sublime配置
前端时间使用webstorm搭建一个node.js的学习环境,感觉非常强大.不过由于其加载的速度,每次让都让我抓狂.后来我找到了一个sublime.虽说3.0以上是收费的,2.0暂时免费.官方的不对s ...
- oracle约束条件状态
Oracle完整性约束有一下4种: • DISABLE NOVALIDATE • ENABLE NOVALIDATE • DISABLE VALIDATE • ENABLE VALIDATE • ...
- IOS-textField
//初始化textfield并设置位置及大小 UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 130, ...
- 文字排版--字体(font-family)
我们可以使用css样式为网页中的文字设置字体.字号.颜色等样式属性.下面我们来看一个例子,下面代码实现:为网页中的文字设置字体为宋体. body{font-family:"宋体"; ...
- FMDB多线程读写问题,使用FMDataBaseQueue操作可以解决同时打开一个链接de读写问题
现在ios里使用的数据库一般都是Sqlite,但是使用Sqlite有个不太好的地方就是在多线程的时候,会出现问题,sqlite只能打开一个读或者写连结.这样的话多线程就会碰到资源占用的问题. 最开始是 ...
- java——输入流FileInputStream
写一个简单的程序,实现从电脑中的一个盘里的文件中往程序中输入内容. package com.liaojianya.chapter5; import java.io.FileInputStream; i ...
- Builder 模式
Builder 模式和 AbstractFactory 模式在功能上很相似,因为都是用来创建大的复杂的对象,它们的区别是:Builder 模式强调的是一步步创建对象,并通过相同的创建过程可以获得不同的 ...
- 理解pkg-config工具
你在 Unix 或 Linux 下开发过软件吗?写完一个程序,编译运行完全正常,在你本机上工作得好好的,你放到源代码管理系统中.然后,告诉你的同事说,你可以取下来用了.这时,你长长的出了一口气,几天的 ...