Oracle性能诊断艺术-学习笔记(索引访问方式)
环境准备:
|
1.0 测试表 CREATE TABLE t ( id NUMBER, d1 DATE, n1 NUMBER, n2 NUMBER, n3 NUMBER, n4 NUMBER, n5 NUMBER, n6 NUMBER, c1 VARCHAR2(20), c2 VARCHAR2(20), pad VARCHAR2(4000), CONSTRAINT t_pk PRIMARY KEY (id) ); 2.0 execute dbms_random.seed(0) 3.0 INSERT INTO t SELECT rownum AS id, trunc(to_date('2007-01-01','yyyy-mm-dd')+rownum/27.4) AS d1, nullif(1+mod(rownum,19),10) AS n1, nullif(1+mod(rownum,113),10) AS n2, nullif(1+mod(rownum,61),10) AS n3, nullif(1+mod(rownum,19),10) AS n4, nullif(1+mod(rownum,113),10) AS n5, nullif(1+mod(rownum,61),10) AS n6, dbms_random.string('p',20) AS c1, dbms_random.string('p',20) AS c2, dbms_random.string('p',255) AS pad FROM dual CONNECT BY level <= 10000 ORDER BY dbms_random.value; 4.0 CREATE INDEX i_n1 ON t (n1); CREATE INDEX i_n2 ON t (n2); CREATE INDEX i_n3 ON t (n3); CREATE INDEX i_n123 ON t (n1, n2, n3); CREATE BITMAP INDEX i_bt_n4 ON t (n4); CREATE BITMAP INDEX i_bt_n5 ON t (n5); CREATE BITMAP INDEX i_bt_n6 ON t (n6); CREATE INDEX i_c1 ON t (c1); CREATE BITMAP INDEX i_bt_c2 ON t (c2); 5.0 BEGIN dbms_stats.gather_table_stats( ownname => user, tabname => 'T', estimate_percent => 100, method_opt => 'for all columns size skewonly', cascade => TRUE ); END; / |
6.0 ALTER SESSION SET statistics_level = all; --这是很关键的一步
7.0 分情况对待
7.1 字段id为主键,谓词条件中包含 id 且返回值是 1 故 对 id做 唯一索引扫描

7.2 字段n1 有普通索引,谓词条件中包含 n1= 且返回值是多个, 故作索引范围扫描

7.3 等于条件和B-树索引

7.4 等于条件和位图索引
|
按照执行的顺序: 第一个操作是 BITMAP INDEX SINGLE VALUE 应用限制条件扫描索引 第二个操作是 BITMAP CONVERSION TO ROWIDS,将第一个操作中获取的位图转换为一个rowid列表中 第三个操作 根据 第二个操作返回的rowid列表访问表。 注意以上操作只执行一次。 |

7.5 IS NULL条件和B-树索引
|
对于B-树索引来说,当使用多个sql条件并且其中至少一个事 不基于 IS NULL 或是 不基于 不等于条件时,才可以通过符合B-树索引来使用 IS NULL 条件。如下的查询对此进行了描述。 执行计划通过操作2上的谓词确认列n2 上的条件使用了索引I-N123.也要注意到 操作2 只返回了5行,杜宇前面一节的例子,没有n2 is null ,返回了 527行。 |

7.6 is null条件和位图索引
位图索引可以存储 null值哦

7.7 范围条件和B-树索引
索引扫描默认是升序的。意味着 当 order by 和 范围条件都是用同一列的时候,结果已经排好序了。因而,不用进行显示的排序。不过 当需要降序进行 order by 的时候,需要显示的制指定 index_desc


7.8 范围条件和位图索引
用位图索引,范围条件和等于条件以相同方式处理。唯一的差别是使用了 BITMAP INDEX RANGE SCAN 操作而不是BITMAP INDEX SINGLE VALUE操作。

7.9 IN 条件
|
in条件没有特定的访问路径。相反,在执行计划中,inlist iterator操作指出因为in条件的原因部分执行计划被多次执行。如下三个查询演示了操作如何根据索引类型被用于索引扫描。 第一个是唯一索引 第二个是非唯一索引 第三个是位图索引 |



- Min/max函数和B-树索引 Index full scan(min/max)j仅仅得到最右边和最左边的索引键








Oracle性能诊断艺术-学习笔记(索引访问方式)的更多相关文章
- Oracle性能诊断艺术-读书笔记
create table test0605 as select * from dba_objects; select t1.owner,t1.object_name,t1.object_id from ...
- Oracle性能诊断艺术-读书笔记(范围分区)
1. PARTITION RANGE SINGLE 注意:操作2 中的 TABLE ACCESS FULL 并不是全表扫描,只是对分区1 做 全分区扫描 case2 2. 分区范围迭代(PARTITI ...
- Oracle性能诊断艺术-读书笔记(执行计划中显示 Starts, E-Rows, REM A-Rows and A-Time)等)
必须以 ' runstats_last '的方式查看执行计划哦! 操作一 hint /*+ gather_plan_statistics */ : /* 添加 hint /*+ gather_ ...
- Oracle性能诊断艺术-读书笔记(脚本dbms_xplan_output截图-非常好的)
- Oracle性能诊断艺术-读书笔记(脚本execution_plans截图)
- Oracle性能诊断艺术-相关脚本说明
第二章 bind_variables.sql 展示怎样绑定变量及何时绑定变量会导致游标共享 bind_variables_peeking.sql 展示绑定变量窥测的优缺点 selectivi ...
- oracle性能诊断艺术-执行计划
--case1 --case2 --case3 --case4 --case5 --case6 --case7 --case8 --case9 --case10 --case12 SQL> AL ...
- Bootstrap~学习笔记索引
回到占占推荐博客索引 bootstrap已经用了有段时间了,感觉在使用上还是比较容易接受的,在开发人员用起来上,也还好,不用考虑它的兼容性,手机,平台,PC都可以有效的兼容. bootstrap官方a ...
- docker~学习笔记索引
回到占占推荐博客索引 使用docker也有段时间了,写了不少文章与总结,下面把它整理个目录出来,方便大家去学习与检索! docker~学习笔记索引 docker~linux下的部署和基本命令(2017 ...
随机推荐
- python之路----面向对象中的内置函数
property属性 什么是特性property property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值 例一:BMI指数(bmi是计算而来的,但很明显它听起来像是一个属性而非方法 ...
- C站投稿映兔源的方法
(因映兔源也不太稳定了,所以不建议映兔上传,正在找其他视频源代替映兔,另外等待C站大大们的webbt源)(20180226) 测试换文件格式后会不会失效,能坚持几天?http://www.cnblog ...
- bzoj1660 / P2866 [USACO06NOV]糟糕的一天Bad Hair Day
P2866 [USACO06NOV]糟糕的一天Bad Hair Day 奶牛题里好多单调栈..... 维护一个单调递减栈,存每只牛的高度和位置,顺便统计一下答案. #include<iostre ...
- 利用构建缓存机制缩短Docker镜像构建时间
在使用Docker部署PHP或者node.js应用时,常用的方法是将代码和环境镜像打包成一个镜像然后运行,一些云厂商提供了非常便捷的操作,只需要把我们的代码提交到VCS上,然后它们就会帮我们拉取代码并 ...
- 骁龙820和KryoCPU:异构计算与定制计算的作用 【转】
本文转载自:https://www.douban.com/group/topic/89037625/ Qualcomm骁龙820处理器专为提供创新用户体验的顶级移动终端而设计.为实现消费者所期望的创新 ...
- linux的dns被劫持
环境:ubuntu16.04 解说:ubuntu使用dnsmasq获取要解析的网站ip,dnsmasq通过域名服务器获取网站ip,并将ip缓存起来,那么就可以减少对外网域名服务器的访问,从而可以使系统 ...
- linux指定某用户某组挂载外接硬盘以便操作硬盘
一.环境:发行版本:ubuntu 14.04 64bit 二.获取要指定的用户及组id 使用id命令 (笔者获取的uid和gid都为1000) 三.获取识别的硬盘路径 sudo fdisk -l ( ...
- zedgraph右键菜单的汉化
http://blog.csdn.net/jeryler/article/details/7876376 修改 zedGraphControl的ContextMenuBuilder事件即可! zedG ...
- java进制转换代码
定义十进制的数直接写,定义8进制的数以0开头,定义二进制的数以0b开头,定义十六进制的数以0x开头需要将十进制的数以二进制的数表示出来可以参照下例: int a = 10; System.out.pr ...
- Apache+Php+Mariadb+NFS+discuz
安装LAMP服务器,并利用discuz做测试 nfs + discuz 192.168.108.158 php + DNS 192.168.108.160 apache ...