1. SQL> create table t as select * from dba_objects;
  2.  
  3. Table created.
  4.  
  5. SQL> create index idx_t on t(object_id);
  6.  
  7. Index created.
  8.  
  9. SQL> BEGIN
  10. 2 DBMS_STATS.GATHER_TABLE_STATS(ownname => 'TEST',
  11. 3 tabname => 'T',
  12. 4 estimate_percent => 100,
  13. 5 method_opt => 'for all columns size auto',
  14. 6 degree => DBMS_STATS.AUTO_DEGREE,
  15. 7 cascade => TRUE);
  16. 8 END;
  17. 9 /
  18.  
  19. SQL> select leaf_blocks,blevel,clustering_factor from dba_indexes where index_name='IDX_T';
  20.  
  21. LEAF_BLOCKS BLEVEL CLUSTERING_FACTOR
  22. ----------- ---------- -----------------
  23. 165 1 1705
  24.  
  25. LEAF_BLOCKS 叶子块 165
  26.  
  27. BLEVEL 索引高度-1
  28.  
  29. 集群因子;
  30. CLUSTERING_FACTOR =1705
  31.  
  32. SQL> select count(distinct dbms_rowid.rowid_block_number(rowid)) from T;
  33.  
  34. COUNT(DISTINCTDBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID))
  35. ---------------------------------------------------
  36. 1057
  37.  
  38. 存储在1057个块中
  39.  
  40. SQL> set linesize 200
  41. SQL> select b.num_rows,
  42. a.num_distinct,
  43. a.num_nulls,
  44. utl_raw.cast_to_number(high_value) high_value,
  45. utl_raw.cast_to_number(low_value) low_value,
  46. (b.num_rows - a.num_nulls) "NUM_ROWS-NUM_NULLS",
  47. utl_raw.cast_to_number(high_value) -
  48. utl_raw.cast_to_number(low_value) "HIGH_VALUE-LOW_VALUE"
  49. from dba_tab_col_statistics a, dba_tables b
  50. where a.owner = b.owner
  51. and a.table_name = b.table_name
  52. and a.owner = 'TEST'
  53. and a.table_name = upper('T')
  54. and a.column_name = 'OBJECT_ID'; 2 3 4 5 6 7 8 9 10 11 12 13 14
  55.  
  56. NUM_ROWS NUM_DISTINCT NUM_NULLS HIGH_VALUE LOW_VALUE NUM_ROWS-NUM_NULLS HIGH_VALUE-LOW_VALUE
  57. ---------- ------------ ---------- ---------- ---------- ------------------ --------------------
  58. 74486 74486 0 77616 2 74486 77614
  59.  
  60. SQL> explain plan for select owner from t where object_id<1000;
  61.  
  62. Explained.
  63.  
  64. SQL> select * from table(dbms_xplan.display());
  65.  
  66. PLAN_TABLE_OUTPUT
  67. ------------------------------------------------------------------------------------------------------------------------------------------------------------
  68.  
  69. --------------------------------------------
  70. Plan hash value: 1594971208
  71.  
  72. -------------------------------------------------------------------------------------
  73. | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
  74. -------------------------------------------------------------------------------------
  75. | 0 | SELECT STATEMENT | | 958 | 10538 | 26 (0)| 00:00:01 |
  76. | 1 | TABLE ACCESS BY INDEX ROWID| T | 958 | 10538 | 26 (0)| 00:00:01 |
  77. |* 2 | INDEX RANGE SCAN | IDX_T | 958 | | 4 (0)| 00:00:01 |
  78. -------------------------------------------------------------------------------------
  79.  
  80. Predicate Information (identified by operation id):
  81.  
  82. PLAN_TABLE_OUTPUT
  83. ------------------------------------------------------------------------------------------------------------------------------------------------------------
  84.  
  85. --------------------------------------------
  86. ---------------------------------------------------
  87.  
  88. 2 - access("OBJECT_ID"<1000)
  89.  
  90. 14 rows selected.
  91.  
  92. 索引扫描首先要定义到叶子块:
  93.  
  94. 定位到叶子块 要扫描 多少个块??? 需要高度-1个块
  95.  
  96. 叶子块个数 乘以 选择性
  97.  
  98. 定位到叶子块 要扫描 多少个块???
  99.  
  100. 回表和集群因子有关:
  101.  
  102. 选择性(Selectivity) 列唯一键(Distinct_Keys) 与行数(Num_Rows)的比值。
  103.  
  104. 这里有个概念叫有效选择性 ,< 的有效选择性为
  105.  
  106. (limit-low_value)/(high_value-low_value)
  107.  
  108. limit 是限制
  109. 1000
  110.  
  111. low_value=2
  112.  
  113. 1000-2 有可能扫到的值的范围
  114.  
  115. high_value-low_value 表示总共有多少个值:
  116.  
  117. HIGH_VALUE=77616
  118.  
  119. LOW_VALUE=2
  120.  
  121. HIGH_VALUE-LOW_VALUE=77614
  122.  
  123. LEAF_BLOCKS=165
  124.  
  125. 索引扫描的计算公式如下:
  126. cost =
  127. blevel +
  128. celiling(leaf_blocks *effective index selectivity) +
  129. celiling(clustering_factor * effective table selectivity)
  130.  
  131. SQL> select 1+ceil(165*(1000-2)/77614)+ceil(1705*(1000-2)/77614) from dual;
  132.  
  133. 1+CEIL(165*(1000-2)/77614)+CEIL(1705*(1000-2)/77614)
  134. ----------------------------------------------------
  135. 26
  136.  
  137. 为啥effective table selectivityeffective index selectivity一样?
  138.  
  139. 表和索引都包含指定列的数据 两者当然一样

Oracle索引扫描算法的更多相关文章

  1. Oracle索引扫描

    Oracle索引扫描:先通过index查找到索引的值,并根据索引的值对应的rowid值(对于非唯一索引可能返回多个rowid值)直接从表中得到具体的数据.一个rowid唯一的表示一行数据,该行对应的数 ...

  2. Oracle 索引扫描的4种类型

    根据索引的类型与where限制条件的不同,有4种类型的Oracle索引扫描: 3,4可归一种 (1) 索引唯一扫描(index uniquescan) (2) 索引范围扫描(index range s ...

  3. Oracle 索引扫描的五种类型

    之前在讨论CBO和RBO的时候提到了索引扫描的几种类型. Oracle Optimizer CBO RBO http://blog.csdn.net/tianlesoftware/archive/20 ...

  4. oracle 索引扫描类型的分类与构造

    1. INDEX RANGE SCAN--请记住这个INDEX RANGE SCAN扫描方式drop table t purge;create table t as select * from dba ...

  5. Oracle 索引扫描的几种情况

    index range scan(索引范围扫描): 1.对于unique index来说,如果where 条件后面出现了<,> ,between ...and...的时候,那么就可能执行i ...

  6. Oracle索引梳理系列(八)- 索引扫描类型及分析(高效索引必备知识)

    版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...

  7. oracle 基础知识(十四)----索引扫描

    (1)索引唯一扫描(index unique scan) 通过唯一索引查找一个数值经常返回单个ROWID.如果该唯一索引有多个列组成(即组合索引),则至少要有组合索引的引导列参与到该查询中,如创建一个 ...

  8. Oracle 表的访问方式(2)-----索引扫描

    索引扫描(Index scan) 我们先通过index查找到数据对应的rowid值(对于非唯一索引可能返回多个rowid值),然后根据rowid直接从表中得到具体的数据,这种查找方式称为索引扫描或索引 ...

  9. 关于ORACLE索引的几种扫描方式

    ------------恢复内容开始------------ ------------恢复内容开始------------ 一条sql执行的效率因执行计划的差异而影响,经常说这条sql走索引了,那条s ...

随机推荐

  1. optimizer hints

    In version MySQL 5.7.7 Oracle presented a new promising feature: optimizer hints. However it did not ...

  2. Java基础知识强化之多线程笔记01:多线程基础知识(详见Android(java)笔记61~76)

    1. 基础知识: Android(java)学习笔记61:多线程程序的引入    ~    Android(java)学习笔记76:多线程-定时器概述和使用 

  3. nodejs开发环境sublime配置

    前端时间使用webstorm搭建一个node.js的学习环境,感觉非常强大.不过由于其加载的速度,每次让都让我抓狂.后来我找到了一个sublime.虽说3.0以上是收费的,2.0暂时免费.官方的不对s ...

  4. oracle约束条件状态

    Oracle完整性约束有一下4种: • DISABLE NOVALIDATE • ENABLE NOVALIDATE • DISABLE VALIDATE • ENABLE VALIDATE   •  ...

  5. IOS-textField

    //初始化textfield并设置位置及大小 UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 130, ...

  6. 文字排版--字体(font-family)

    我们可以使用css样式为网页中的文字设置字体.字号.颜色等样式属性.下面我们来看一个例子,下面代码实现:为网页中的文字设置字体为宋体. body{font-family:"宋体"; ...

  7. FMDB多线程读写问题,使用FMDataBaseQueue操作可以解决同时打开一个链接de读写问题

    现在ios里使用的数据库一般都是Sqlite,但是使用Sqlite有个不太好的地方就是在多线程的时候,会出现问题,sqlite只能打开一个读或者写连结.这样的话多线程就会碰到资源占用的问题. 最开始是 ...

  8. java——输入流FileInputStream

    写一个简单的程序,实现从电脑中的一个盘里的文件中往程序中输入内容. package com.liaojianya.chapter5; import java.io.FileInputStream; i ...

  9. Builder 模式

    Builder 模式和 AbstractFactory 模式在功能上很相似,因为都是用来创建大的复杂的对象,它们的区别是:Builder 模式强调的是一步步创建对象,并通过相同的创建过程可以获得不同的 ...

  10. 理解pkg-config工具

    你在 Unix 或 Linux 下开发过软件吗?写完一个程序,编译运行完全正常,在你本机上工作得好好的,你放到源代码管理系统中.然后,告诉你的同事说,你可以取下来用了.这时,你长长的出了一口气,几天的 ...