一、B-Tree索引

三大特点:高度较低、存储列值、结构有序

1.1利用索引特性进行优化

外键上建立索引:不但可以提升查询效率,而且可以有效避免锁的竞争(外键所在表delete记录未提交,主键所在表会被锁住)。

统计类查询SQL:count(), avg(), sum(), max(), min()

排序操作:order by字段建立索引

去重操作:distinct

UNION/UNION ALL:union all不需要去重,不需要排序

1.2联合索引

应用场景一:SQL查询列很少,建立查询列的联合索引可以有效消除回表,但一般超过3个字段的联合索引都是不合适的.
   应用场景二:在字段A返回记录多,在字段B返回记录多,在字段A,B同时查询返回记录少,比如执行下面的查询,结果c1,c2都很多,c3却很少。

    select count(1) c1 from t where A = 1;
select count(1) c2 from t where B = 2;
select count(1) c3 from t where A = 1 and B = 2;

   联合索引的列谁在前?
    普遍流行的观点:重复记录少的字段放在前面,重复记录多的放在后面,其实这样的结论并不准确。

    drop table t purge;
create table t as select * from dba_objects;
create index idx1_object_id on t(object_id,object_type);
create index idx2_object_id on t(object_type,object_id);
    --等值查询:
select * from t where object_id = 20 and object_type = 'TABLE';
select /*+ index(t,idx1_object_id) */ * from t where object_id = 20 and object_type = 'TABLE';
select /*+ index(t,idx2_object_id) */ * from t where object_id = 20 and object_type = 'TABLE';

观察语句执行计划得出结论:等值查询情况下,组合索引的列无论哪一列在前,性能都一样。

    --范围查询:
select * from t where object_id >=20 and object_id < 2000 and object_type = 'TABLE';
select /*+ index(t,idx1_object_id) */ * from t where object_id >=20 and object_id < 2000 and object_type = 'TABLE';
select /*+ index(t,idx2_object_id) */ * from t where object_id >=20 and object_id < 2000 and object_type = 'TABLE';

结论:组合索引的列,等值查询列在前,范围查询列在后。 但如果在实际生产环境要确定组合索引列谁在前,要综合考虑所有常用SQL使用索引情况,因为索引过多会影响入库性能。例如这个例子中,如果其他SQL可以频繁使用到object_id的单列索引,而当单列的查询列和联合索引的前置列一样,单列可以不建立索引,这种情况单列的查询也可以用到组合索引。则综合考虑将object_id放在前面。

1.3索引的危害

表上有过多索引主要会严重影响插入性能;

对delete操作,删除少量数据索引可以有效快速定位,提升删除效率,但是如果删除大量数据就会有负面影响;

对update操作类似delete,而且如果更新的是非索引列则无影响。

1.4索引的监控

    --监控
alter index [index_name] monitoring usage;
select * from v$object_usage;
--取消监控:
alter index [index_name] nomonitoring usage;

根据对索引监控的结果,对长时间未使用的索引可以考虑将其删除。

1.5索引的常见执行计划

INDEX FULL SCAN:索引的全扫描,单块读,有序
    INDEX RANGE SCAN:索引的范围扫描
    INDEX FAST FULL SCAN:索引的快速全扫描,多块读,无序
    INDEX FULL SCAN(MIN/MAX):针对MAX(),MIN()函数的查询
    INDEX SKIP SCAN:查询条件没有用到组合索引的第一列,而组合索引的第一列重复度较高时,可能用到

二、位图索引

应用场景:表的更新操作极少,重复度很高的列。

优势:count(*) 效率高

即席查询效率高(这个特性实际验证存在版本差异:在10.2.0.1版本验证位图索引的即席查询效率远高于组合索引查询效率,而在11.2.0.3版本验证普通组合索引的即席查询效率却比位图索引的效率还要高效)

  create table t(
name_id,
gender not null,
location not null,
age_range not null,
data
)as select
rownum,
decode(floor(dbms_random.value(0,2)),0,'M',1,'F') gender,
ceil(dbms_random.value(0,50)) location,
decode(floor(dbms_random.value(0,4)),0,'child',1,'young',2,'middle',3,'old') age_range,
rpad('*',20,'*') data
from dual connect by rownum <= 100000;
  create index idx_t on t(gender,location,age_range);
create bitmap index gender_idx on t(gender);
create bitmap index location_idx on t(location);
create bitmap index age_range_idx on t(age_range);
  select * from t where gender = 'M' and location in (1,10,30) and age_range = 'child';
select /*+ index(t,idx_t) */* from t where gender = 'M' and location in (1,10,30) and age_range = 'child';

三、函数索引

应用场景:不得不对某一列进行函数运算的场景。

利用函数索引的效率要低于利用普通索引的。

参考书籍:《收获,不止Oracle》

SQL Tuning 基础概述05 - Oracle 索引类型及介绍的更多相关文章

  1. SQL Tuning 基础概述10 - 体会索引的常见执行计划

    在<SQL Tuning 基础概述05 - Oracle 索引类型及介绍>的1.5小节,提到了几种"索引的常见执行计划": INDEX FULL SCAN:索引的全扫描 ...

  2. SQL Tuning 基础概述04 - Oracle 表的类型及介绍

    Tables A table describes an entity such as employees. You define a table with a table name, such as ...

  3. SQL Tuning 基础概述10

    在<SQL Tuning 基础概述05 - Oracle 索引类型及介绍>的1.5小节,提到了几种"索引的常见执行计划": INDEX FULL SCAN:索引的全扫描 ...

  4. SQL Tuning 基础概述08 - SQL Tuning Advisor

    SQL调优顾问 SQL Tuning Advisor的使用案例: 1.构建测试表T 2.定义调整任务 3.修改调整任务参数 4.执行调整任务 5.监控调整任务 6.查看调整任务建议 7.删除调整任务 ...

  5. Oracle Tuning 基础概述01 - Oracle 常见等待事件

    对Oracle数据库整体性能的优化,首先要关注的是在有性能问题时数据库排名前几位等待事件是哪些.Oracle等待事件众多,随着版本的升级,数量还在不断增加,可以通过v$event_name查到当前数据 ...

  6. SQL Tuning 基础概述09 - SQL Access Advisor

    Oracle官方文档对SQL Access Advisor的描述如下: SQL Access Advisor, which is a tuning tool that provides advice ...

  7. SQL Tuning 基础概述06 - 表的关联方式:Nested Loops Join,Merge Sort Join & Hash Join

    nested loops join(嵌套循环)   驱动表返回几条结果集,被驱动表访问多少次,有驱动顺序,无须排序,无任何限制. 驱动表限制条件有索引,被驱动表连接条件有索引. hints:use_n ...

  8. SQL Tuning 基础概述03 - 使用sql_trace和10046事件跟踪执行计划

    1.使用sql_trace跟踪执行计划 1.1 当前session跟踪: alter session set sql_trace = true; //开始sql_trace alter session ...

  9. SQL Tuning 基础概述01 - Autotrace的设定

    1.autotrace的设定 SQL> set autotrace Usage: SET AUTOT[RACE] {OFF | ON | TRACE[ONLY]} [EXP[LAIN]] [ST ...

随机推荐

  1. 【原】FMDB源码阅读(三)

    [原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...

  2. 无法向会话状态服务器发出会话状态请求。请确保 ASP.NET State Service (ASP.NET 状态服务)已启动,并且客户端端口与服务器端口相同。如果服务器位于远程计算机上,请检查。。。

    异常处理汇总-服 务 器 http://www.cnblogs.com/dunitian/p/4522983.html 无法向会话状态服务器发出会话状态请求.请确保 ASP.NET State Ser ...

  3. scrapy 知乎用户信息爬虫

    zhihu_spider 此项目的功能是爬取知乎用户信息以及人际拓扑关系,爬虫框架使用scrapy,数据存储使用mongo,下载这些数据感觉也没什么用,就当为大家学习scrapy提供一个例子吧.代码地 ...

  4. .Net Core MVC 网站开发(Ninesky) 2.3、项目架构调整-控制反转和依赖注入的使用

    再次调整项目架构是因为和群友dezhou的一次聊天,我原来的想法是项目尽量做简单点别搞太复杂了,仅使用了DbContext的注入,其他的也没有写接口耦合度很高.和dezhou聊过之后我仔细考虑了一下, ...

  5. ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第一章:创建基本的MVC Web站点

    在这一章中,我们将学习如何使用基架快速搭建和运行一个简单的Microsoft ASP.NET MVC Web站点.在我们马上投入学习和编码之前,我们首先了解一些有关ASP.NET MVC和Entity ...

  6. angular2系列教程(九)Jsonp、URLSearchParams、中断选择数据流

    大家好,今天我们要讲的是http模块的第二部分,主要学习ng2中Jsonp.URLSearchParams.observable中断选择数据流的用法. 例子

  7. Entity Framework 手动使用migration里面的up 和down方法。

    add-migration -IgnoreChanges 201606100717405_201606100645298_InitialCreate 执行这一句后 ,清空使用map生成的代码,个人不太 ...

  8. 浅谈JSP中include指令与include动作标识的区别

    JSP中主要包含三大指令,分别是page,include,taglib.本篇主要提及include指令. include指令使用格式:<%@ include file="文件的绝对路径 ...

  9. ios 获取或修改网页上的内容

    UIWebView是iOS最常用的SDK之一,它有一个stringByEvaluatingJavaScriptFromString方法可以将javascript嵌     入页面中,通过这个方法我们可 ...

  10. Intelli IDEA 设置项目编码(Mac)

    Intelli IDEA->Editor->File Encodings