广告
返回顶部
首页 > 资讯 > 数据库 >浅谈Oracle索引
  • 479
分享到

浅谈Oracle索引

浅谈Oracle索引 2014-07-01 21:07:50 479人浏览 猪猪侠
摘要

oracle中查询走索引的情况: 对返回的行无任何限定条件,即没有where子句。 未对数据表与任何索引主列相对应的行限定条件。 例如:在id-name-time列创建了三列复合索引,那么仅对name列限定条件不能使用这个索

浅谈Oracle索引

oracle中查询走索引的情况:

对返回的行无任何限定条件,即没有where子句。

未对数据表与任何索引主列相对应的行限定条件。

例如:在id-name-time列创建了三列复合索引,那么仅对name列限定条件不能使用这个索引,因为name不是索引的主列。

对索引的主列有限定条件,但是在条件表达式里使用以下表达式则会使索引失效,造成权标扫描:

(1)where子句中对字段进行函数、表达式操作,这将导致引擎放弃使用索引而进行全表扫描。

(2)查询字段is null时索引失效,引起全表查询。

解决办法:sql语法中使用null会有很多麻烦,最好索引列时not null的;对于is null,可以建立组合索引, nvl(字段,0),对表和索引analyse后,is null查询时可以重新启用索引查找,但是效率还不是值得肯定;is not null时永远不会使用索引。一般数据量大的表不要用is null查询。

(3) 查询条件中使用了不等于操作符(<>、!=)会限制索引、引起全表扫描

解决方法:通过把不等于操作符改成or,可以使用索引,避免全表扫描。
例如,把column<>10,改成column<10 or column>10,就可以使用索引了。

(4)对索引的主列有限定条件,但是条件使用like操作以及值以‘%’开始或者值是一个赋值变量。

例如:where city like "%大连%"。

select * from citys where name like "%大连" (不使用索引)
select * from citys where name like "大连%" (使用索引) 。

解决办法:首先尽量避免模糊查询,如果必须使用,不采用全模糊查询,也应尽量采用右模糊查询, 即like ‘…%’,是会使用索引的;左模糊like ‘%...’无法直接使用索引,但可以利用reverse + function index 的形式,变化成 like ‘…%’;

全模糊查询是无法优化的,一定要使用的话建议使用搜索引擎。

or语句使用不当会引起全表扫描

原因:where子句中比较的两个条件,一个有索引,一个没索引,使用or则会引起全表扫描。
例如:where A=:1 or B=:2,A上有索引,B上没索引,则比较B=:2时会重新开始全表扫描

组合索引

排序时应按照组合索引中各列的顺序进行排序,即使索引中只有一个列是要排序的,否则排序性能会比较差。

例如:

create index skip1 on emp5(job,empno,date);
select job,empno from emp5 where job=’manager’ and empno=’10’ order by job,empno,date desc; 

实际上只是查询出符合 job=’manager’ and empno=’10’  条件的记录并按date降序排序,但写成order by date desc性能较差。

Update语句,如果只更改1、2个字段,不要Update全部字段,否则频繁调用会引起明显的性能消耗,同时带来大量日志

对于多张大数据量的表JOIN,要先分页再JOIN,否则逻辑读会很高,性能很差。

select count(*) from table;
这样不带任何条件的count会引起全表扫描,并且没有任何业务意义,是一定要杜绝的。

sql的where条件要绑定变量,比如where column= 1,不要写成where column=‘aaa’,这样会导致每次执行时都会重新分析,浪费CPU和内存资源。

不要使用in操作符,这样数据库会进行全表扫描。

not in 使用not in也不会走索引

推荐方案:用not exists或者(外联结+判断为空)来代替

> 及 < 操作符(大于或小于操作符)

大于或小于操作符一般情况下是不用调整的,因为它有索引就会采用索引查找。
但有的情况下可以对它进行优化,如一个表有100万记录,一个数值型字段 A,30万记录的A=0,30万记录的A=1,39万记录的A=2,1万记录的A=3。
那么执行A>2与A>=3的效果就有很大的区别了,因为A>2时ORACLE会先找出为2的记录索引再进行比较,而A>=3时ORACLE则直接找到=3的记录索引。

UNION操作符

UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。
实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION。如:
select * from GC_dfys
union
select * from ls_jg_dfys
这个SQL在运行时先取出两个表的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序。
推荐方案:采用UNION ALL操作符替代UNION,因为UNION ALL操作只是简单的将两个结果合并后就返回。

WHERE后面的条件顺序影响

Select * from zl_yhjbqk where dy_dj = "1K以下" and xh_bz=1
Select * from zl_yhjbqk where xh_bz=1 and dy_dj = "1K以下"

以上两个SQL中dy_dj及xh_bz两个字段都没进行索引,所以执行的时候都是全表扫描,
第一条SQL的dy_dj = "1KV以下"条件在记录集内比率为99%,而xh_bz=1的比率只为0.5%,在进行第一条SQL的时候99%条记录都进行dy_dj及xh_bz的比较。
而在进行第二条SQL的时候 0.5%条记录都进行dy_dj及xh_bz的比较,以此可以得出第二条SQL的CPU占用率明显比第一条低。

查询表顺序的影响

在FROM后面的表中的列表顺序会对SQL执行性能影响,在没有索引及ORACLE没有对表进行统计分析的情况下ORACLE会按表出现的顺序进行链接,
由此因为表的顺序不对会产生十分耗服务器资源的数据交叉。(注:如果对表进行了统计分析,ORACLE会自动先进小表的链接,再进行大表的链接)

表连接时,数据量大的为主表效率更高。

16、Oracle的解析器按照从右到左的顺序处理from子句中的表名,因此from子句中写在最后的表(基础班 driving table)将先被最先处理。

在from子句中包含多个表的情况下,必须选择记录条数最少的表作为基础表,放在最后。
以下几种情况快速判断基础表(驱动表):

(1)where子句中尽量使用索引。

(2)连接操作应返回较少行上驱动。

(3)如果where中包含选择性条件,如where id=1,应将最具有选择性部分放在表达式最后。

(4)如果只有一个表有索引,另一表无索引,无索引的表通常作为基础表。

您可能感兴趣的文档:

--结束END--

本文标题: 浅谈Oracle索引

本文链接: https://www.lsjlt.com/news/5401.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 浅谈Oracle索引
    Oracle中查询走索引的情况: 对返回的行无任何限定条件,即没有where子句。 未对数据表与任何索引主列相对应的行限定条件。 例如:在id-name-time列创建了三列复合索引,那么仅对name列限定条件不能使用这个索...
    99+
    2014-07-01
    浅谈Oracle索引
  • 浅谈C#索引器
    目录一、概要二、应用场景一、概要 索引器使你可从语法上方便地创建类、结构或接口,以便客户端应用程序可以像访问数组一样访问它们。编译器将生成一个 Item 属性(或者如果存在 Inde...
    99+
    2022-11-12
  • 浅谈MySQL聚簇索引
    目录1. 什么是聚簇索引2. 聚簇索引和主键3. 聚簇索引优缺点4. 最佳实践1. 什么是聚簇索引 数据库的索引从不同的角度可以划分成不同的类型,聚簇索引便是其中一种。 聚簇索引英文是 Clustered Index,有...
    99+
    2023-04-19
    MySQL索引 MySQL聚簇索引
  • 浅谈索引系列之本地索引与全局索引
    分区表按照类型可以分为范围分区(Range)、列表分区(List)以及哈希分区(Hash),表被分区后,其对应的索引也会与普通表的索引有所不同。 基本概念    &nb...
    99+
    2022-10-18
  • 浅谈MySQL索引优化分析
    为什么你写的sql查询慢?为什么你建的索引常失效?通过本章内容,你将学会MySQL性能下降的原因,索引的简介,索引创建的原则,explain命令的使用,以及explain输出字段的意义。助你了解索引,分析索...
    99+
    2022-10-18
  • 浅谈TypeScript 索引签名的理解
    目录1.什么是索引签名2. 索引签名语法3. 索引签名的注意事项3.1不存在的属性3.2 string 和 number 键4.索引签名与 Record<Keys, Type&...
    99+
    2022-11-12
  • 浅谈MySQL的B树索引与索引优化小结
    MySQL的MyISAM、InnoDB引擎默认均使用B+树索引(查询时都显示为“BTREE”),本文讨论两个问题: 为什么MySQL等主流数据库选择B+树的索引结构? 如何基于索引结构,理解常见的...
    99+
    2022-10-18
  • 浅谈Mysql主键索引与非主键索引区别
    目录什么是索引主键索引和普通索引的区别索引具体采用的哪种数据结构InnoDB使用的B+ Tree的索引模型,那么为什么采用B+ 树?这和Hash索引比较起来有什么优缺点?B+ Tre...
    99+
    2022-11-12
  • 浅谈MySQL中不等号索引问题
    目录1.当不等号<>作用在普通索引字段上2.当不等号<>作用在主键索引字段上3.当不等号<>作用在唯一索引字段上最近在使用mysql中的一个小总结。 在MySQL中,不等号<&g...
    99+
    2023-03-20
  • 浅谈MySQL为什么会选错索引
    目录1.引例2.优化器的逻辑3.解决办法1.引例 首先创建一张表,并对字段a,b分别建立索引: create table t ( id int(11) not null, a int(11) defaul...
    99+
    2023-03-20
    MySQL 选错索引
  • 浅谈Mysql哪些字段适合建立索引
    1 数据库建立索引常用的规则如下: 表的主键、外键必须有索引; 2、数据量超过300的表应该有索引; 3、经常与其他表进行连接的表,在连接字段上应该建立索引; 4、经常出现在Where子句中的字段,特别是...
    99+
    2022-05-25
    Mysql字段索引 Mysql 字段建立索引
  • 浅谈React 的引入
    目录1. CDN 引入1.1 react (先引入)1.2 react-dom (后引入)1.3 查看是否成功引入 react2. Webpack 引入3. create-react...
    99+
    2022-11-12
  • 浅谈mysql哪些情况会导致索引失效
    下面有一些培训教学机构的口诀和我个人的一些总结: 为了讲解以下索引内容,我们先建立一个临时的表 test02 CREATE TABLE `sys_user` ( `id` v...
    99+
    2022-11-12
  • 索引——谈谈你对索引的认识和理解
    为什么要用索引? 一般的应用系统,读写比例在10:1左右,插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句的优化显然是重中之重。说起加速查询,就不得...
    99+
    2020-08-25
    索引——谈谈你对索引的认识和理解
  • 浅谈MYSQL引擎之INNODB引擎
    MYSQL 常用的引擎主要有一下几种,MRG_MYISAM 、CSV 、MyISAM、InnoDB、MEMORY ,NDB,其中MyISAM、InnoDB是mysql最常用的存储引擎,今天主要讨论 Inno...
    99+
    2022-10-18
  • 浅谈用Python实现一个大数据搜索引擎
    搜索是大数据领域里常见的需求。Splunk和ELK分别是该领域在非开源和开源领域里的领导者。本文利用很少的Python代码实现了一个基本的数据搜索功能,试图让大家理解大数据搜索的基本原理。 布隆过滤器 (B...
    99+
    2022-06-04
    浅谈 搜索引擎 数据
  • 浅谈mysql增加索引不生效的几种情况
    增加索引可以提高查询效率。 增加索引就是增加一个索引文件,存放的是数据的地址,类似与我们文档的目录,在查找过程中可以不用从书的内容查找,直接根据目录对应的页码查找。索引是根据地址查找...
    99+
    2022-11-12
  • 浅谈MySql整型索引和字符串索引失效或隐式转换问题
    目录问题概述问题重现问题引申结论问题概述 今天在上班时,DBA突然找出来一段sql,表示该sql存在隐式转换,不走索引。经过我们的查看后,发现是类型varchar的字段, 我们使用条...
    99+
    2022-11-12
  • 浅谈ORACLE AWR single instance 一
    Oracle中的AWR,全称为Automatic Workload Repository,自动负载信息库。 AWR是DBA了解其运行状态的重要工具之一,根据AWR报告可以对oracle数据库性能整...
    99+
    2022-10-18
  • 搜索引擎之倒排索引浅析
    上一篇文章 ElasticSearch 术语中提到了倒排索引,那么这篇文章就来讲解下什么是倒排索引,倒排索引的数据结构以及 ElasticSearch 中的倒排索引。 倒排索引 倒排索引(Inverted Index) 也常被称为...
    99+
    2016-11-02
    搜索引擎之倒排索引浅析
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作