Oracle之SQL优化-索引的基本原理(一)
导读:
1、基本概念-索引原理图
2、使用索引时需要注意
3、索引的特性
4、索引的扫描方式
5、索引的类型及特点
6、快速重建索引
1、索引的基本概念:
索引的原理图:
(1)创建索引的目的:
以索引小的IO换取表的大IO。
何时创建索引:
当访问的数据块少于表中20%的数据时,建议使用索引。
(2)索引的副作用
会使insert、delete速度变慢(索引个数多的话速度就会慢)。
对于update语句,需要先判断是否要修改索引列。
(3)单字段索引和组合索引
在Oracle9i之前,只有使用到索引的前导引用时才可以使用组合索引。
现在可以通过索引的跳跃式扫描来使用非前导引用的组合索引。
(4)Oracle的rowid
rowid是直接指向单行的线路图,不同的版本rowid的结构不同,不能对rowid进行硬编码。
具体可看上面的原理图。
2、使用索引时需要注意
(1)条件中使用不等于操作(<>,!=),将不会走索引,而是走全表扫描。
(2)条件中使用IS NULL 或者IS NOT NULL,也不会走索引,走全表扫描。字段可以使用缺省值。
(3)条件中对字段使用函数,也不会走索引,除非是函数索引。
(4)比较不匹配的数据类型时,oracle可以帮我们自动做数据类型的转换,但是oracle还是建议我们最好
使用转换函数(to_char()、to_date()、to_number()等)做显示的转换。
3、索引的选择性
(1)选择性越高,索引返回的数据就越少。
(2)索引的群集因子越高,表中的数据按照这个索引字段越有序,表中返回的数据块就越少。
(3)索引的二元高度的每个级别需要单独的io,如果索引中被删除的行接近20~30%,需要重建索引。
降低二元高度;数据库快的尺寸越大,索引的二元高度就越小。
(4)索引的空间
索引的空间被重复利用的概率很小,有时索引的空间比表大。
4、索引的扫描方式
(1)全局快速扫描索引(fast full scan):
使用hint提示中的INDEX_FFS。索引相对于表的总体大小来说很小。如果在连接中只查询索引的
连接键列时,通常都会执行快速全索引扫描。
(2)跳跃式扫描索引(skip scan):
允许优化器使用组合索引,即使索引的前导列没有出现在where子句里面。比全索引扫描要快得多。
(3)索引的全局扫描(full scan);
(4)索引的范围扫描(range scan)。
5、索引的类型及特点
(1)B——索引
如果索引的值都在索引中,就可以不访问表,从而减少IO量。
(2)位图索引
适用于DSS系统,他使用较少基数(唯一键数目)列访问非常大的表。
B-树索引和位图索引的比较:
B-树索引的索引值中包含rowid,这样oracle就可以在行级别上锁定索引。
位图索引被存储为压缩的索引值,其中包含一个范围的rowid,因此oracle必须针对一个给定值锁
定所有范围内的rowid。这种锁定可能在某些dml语句中造成死锁。
位图索引的限制:
a、基于代价的优化
b、当执行alter table 语句,并修改包含位图索引的列时,位图索引会失效。
c、不能用于任何类型的完整性检查。
d、不能被声明为唯一索引。
注意:不要在繁重的oltp环境中使用位图索引。
创建位图索引
create bitmap index emp_sex on employees(sex)tablespace users;
(3)Hash 索引
使用hash 索引必须使用hash群集。
(4)索引编排表
又称为索引组织表,只有索引段,没有数据段。
(5)反转键索引
数据1234就被存储为4321。不能对位图索引和索引编排表进行反转键处理。
此类型的索引可能比b-索引要慢2.5~3倍。
一般适用于磁盘数很少而插入很多的情况。
创建反序索引
create unique index order_reinx on orders(order_num,order_date)tablespace users reverse;
(6)基于函数的索引
数据库的参数:QUERY_REWRITE_ENABLED = TRUE
创建函数索引(函数索引即可以是普通的B树索引,也可以是位图索引)
create index emp_substr_empno on employees(substr(empno,1,2)) tablespace users;
(7)分区索引
本地索引:有前缀和无前缀。
全局索引:有前缀和无前缀。
6、索引的快速重建
锁表的情况
alter index index_name rebuild;
不锁表的情况
alter index indx_name rebuild online;
注:
B树索引:在B树的叶节点中存储索引字段的值与ROWID。
唯一索引和不唯一索引都只是针对B树索引而言。
复合索引:Oracle最多允许包含32个字段的复合索引。
Oracle之SQL优化-索引的基本原理(一)相关推荐
- 基于oracle的sql优化
[基于oracle的sql优化] 基于oracle的sql优化 [博主]高瑞林 [博客地址]http://www.cnblogs.com/grl214 一.编写初衷描述 在应有系统开发初期,由于数据库 ...
- 从一条巨慢SQL看基于Oracle的SQL优化(重磅彩蛋+PPT)
本文根据DBAplus社群第110期线上分享整理而成,文末还有好书送哦~ 讲师介绍 丁俊 新炬网络首席性能优化专家 SQL审核产品经理 DBAplus社群联合发起人.<剑破冰山-Oracle开发 ...
- oracle数据库sql优化
oracle数据库sql优化 1.select子句中不要使用 * ,这会使数据字典消耗一些资源. 2.尽量定义表的别名使用别名前缀于列做关联,减小解析时间,避免错误. 3. ⽤>=替代> ...
- 崔华 oracle简历,2013数据库大会:崔华-基于Oracle的SQL优化案例分析
2013数据库大会:崔华-基于Oracle的SQL优化案例分析 崔华的新书即将出版,其数据库大会上的演讲也非常精彩,他的新书十分值得期待. 2013年中国数据库技术大会第二天的"Oracle ...
- 超详细图解!【MySQL进阶篇】SQL优化-索引-存储引擎
1. Mysql的体系结构概览 整个MySQL Server由以下组成 Connection Pool : 连接池组件 Management Services & Utilities : 管理 ...
- oracle查询sql走索引吗,Oracle SQL不走索引小记
sql执行计划不走索引 一.优化器认为走全表扫描更优. 在这种情况下,需要重新分析一遍表,更新表的状态,有助于优化器分析出正确的执行计划. analyze table tablename comput ...
- 读书笔记-《基于Oracle的SQL优化》-第二章-1
第二章:Oracle里的执行计划 2.1 什么是执行计划 Oracle用来执行目标SQL语句的这些步骤的组合就被称为执行计划. 执行计划可以分为如下三个部分: 1.目标SQL的正文.SQL ID和其执 ...
- ORACLE-019:ORACLE常用SQL优化hint语句
在SQL语句优化过程中,我们经常会用到hint,现总结一下在SQL优化过程中常见Oracle HINT的用法: 1. /*+ALL_ROWS*/ 表明对语句块选择基于开销的优化方法,并获得最佳吞吐量, ...
- 基于Oracle的SQL优化(崔华著)-学习笔记
201704171025 01. 列rows记录的就是执行计划中每一个执行步骤所对应的Cardinality的值 列Cost(%CPU)记录的就是执行计划中的每一个执行步骤对应的成本 02. Comp ...
最新文章
- 4che3 scu发送超时设置_Redis实现订阅发布与批量发送短信
- 无序数组求第k大的数 python_整数无序数组求第K大数
- TSC工业型条码打印机的价格的影响因素有哪些呢?
- ajax实例详解(2)
- 第九届蓝桥杯B组省赛。
- 局域网计算机共享文件夹点不开,局域网共享文件夹打不开的解决方法
- python 经典图书排行榜_计算机优秀书籍每周销售排行榜
- mac 电脑 java wifi密码尝试器
- CASE WHEN THEN 判断
- C语言可变参数va_list
- IDEA怎么查看现在的项目使用的JDK版本? 2016年4月19日22:51
- 燕千云 YQCloud 数智化业务服务管理平台发布1.11版本
- 计算机水平二级指什么,全国计算机二级是什么
- cloudreve安装linux教程,Cloudreve云盘系统小白超详细图文安装教程
- 关键词文章自动生成的四大要点
- 设计师2022面试UI作品集PSD样机模板
- PDApp.log占用C盘几十G空间,原因及解决方案
- 计算机网络的分类2:按网络覆盖范围分类,分为局域网、城域网、广域网
- 每天坚持慢跑30分钟,一个月身体会有什么变化?
- PHP设计模式(二):工厂方法模式