浅谈Oracle优化与索引
1.Oracle优化
说到Oracle的优化首先要提到就是索引,这是Oracle优化中效果最明显的方式
oracle优化的几个常见方式:
1.对需要经常用到查询的字段建立索引;
2.利用Oracle的解析方式进行数据优化,Oracle的解析方式是自后而前,自右向左,自下而上的方式进行解析SQL,所以利用这个原理,from后面如果有3个以上的表连接查询,将被其他表引用的那个表放在最后面,where后面有多个查询条件时,表连接的条件写在where条件的左边,能过滤掉最大数量的条件写在最后边;
3.对于一个简单的查询SQL,oracle的执行顺序一般是:1-from,2-where,3-group by,4-having,5-select,6-order by,所以能放在where后面的条件,尽量不要放在having后面,因为oracle是先处理where后面的条件,再处理having后面的条件;
4.使用exists的查询效率要高于用in,in的效率高于or,所以能用exists不用in,能用in的不用or;
5.能使用=进行精准查询的时候,尽量不要使用like这样的模糊查询,模糊查询会降低查询效率;
6.在处理大量数据时,大于等于的效率高于大于,比如同样一个条件>2和>=3,>=3的效率会比>2要高一些,因为前者是直接定位到3,再处理3之后的数据,后者是先定位到2,再从2往后推取之后的第一个数据3;
7.用merge代替update,用merge的好处是可以少扫描一次源表,而且更容易调整执行计划。而update通常都是采用类似nested loop的方式进行表之间的连接,并且把被update的表作为外层驱动表,如果该表比较大,则执行效率会很差,这也是为什么要使用merge的原因;
8.不在索引列进行运算,不使用not(改用<>或者> or <)对索引列进行判断,不再索引列进行空值的判断,如name is null,当对索引列进行运算时,优化器不会使用索引,转而进行全表扫描。
9.模糊查询的通配符出现在检索词的词首时也会导致索引失效,出现在其他位置时则不会有影响select * from student where name like '%wish%';
10.避免使用select *,多表连接时尽可能使用表和字段的别名;
11.能用truncate时,不使用delete,delete会产生大量的日志,影响效率。
2.索引
2.1适合建索引的特点
1)在经常需要搜索的列上,可以加快搜索的速度;
2)在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;
3)在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;
4)在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;
5)在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;
6)在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度;
7)基于一个范围的检索,一般查询返回结果集小于表中记录数的30%宜采用;基于非唯一性索引的检索。
2.2不适合建索引的特点
1)对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。
2)对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。
3)对于那些定义为blob数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。
4)当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。
2.3索引的分类
索引大致分为两类,一是B-tree索引,一是位图索引(Bitmapt),Oracle默认创建的就是B-tree索引,简单来说二者的区别就是B-tree索引适合建立在数据差异较大的字段,比如姓名,学号,位图索引适合建立在数据差异较小的字段,比如性别。但是在实际业务运用中也还需要根据具体的情况进行辨别是否使用索引,具体使用哪个索引,比如一个字段sex,他只有男和女,数据量相当,那创建索引实际上最多只能过滤掉一半的数据。比如一个字段is_true,他的结果只有是和否,但是否的数据量相对较少,那建立索引后对需要经常查否的数据来说就会很有效。
B-tree 特点:
适合与大量的增、删、改(OLTP)
不能用包含OR操作符的查询;
适合高基数的列(唯一值多)
典型的树状结构;
每个结点都是数据块;
大多都是物理上一层、两层或三层不定,逻辑上三层;
叶子块数据是排序的,从左向右递增;
在分支块和根块中放的是索引的范围;
Bitmapt 特点:
适合与决策支持系统;
做UPDATE代价非常高;
非常适合OR操作符的查询;
基数比较少的时候才能建位图索引;
不常见的还有复合索引、函数索引、哈希索引和分区索引,复合索引也就是基于多个列创建的索引,这种索引只有在第一个列被where子句使用到时,优化器才会使用到该索引。
注:索引是把双刃剑,虽然建立索引能有效地提高查询效率,但索引也需要占大量的表空间和物理空间,后期还需要经常维护,所以建立索引要慎重选择。
2.4
浅谈Oracle优化与索引相关推荐
- oracle hash join outer,CSS_浅谈Oracle中的三种Join方法,基本概念
Nested loop join:
Outer - phpStudy...
浅谈Oracle中的三种Join方法 基本概念 Nested loop join: Outer table中的每一行与inner table中的相应记录join,类似一个嵌套的循环. Sort mer ...
- 浅谈oracle树状结构层级查询
oracle树状结构查询即层次递归查询,是sql语句经常用到的,在实际开发中组织结构实现及其层次化实现功能也是经常遇到的,虽然我是一个java程序开发者,我一直觉得只要精通数据库那么对于java开发你 ...
- 浅谈数据库优化方面的经验
浅谈数据库优化方面的经验 任何系统.网站几乎都离不开数据库,数据库好比人大脑的记忆系统,没有了数据库就没有了记忆系统.而数据库优化则相当于在同等智力的情况下,利用一种高效率地记忆方法进行更快更优的记忆 ...
- 浅谈Oracle RAC --集群管理软件GI
浅谈Oracle RAC --集群管理软件GI基本架构 今天周五,想想可以过周末,心情大好.一周中最喜欢过的就是周五晚上,最不喜欢过的是周日晚上和周一,看来我不是个热爱劳动的人啊.趁着现在心情愉悦,赶 ...
- 浅谈凸优化中的共轭函数
浅谈凸优化中的共轭函数 函数ff的共轭定义: f∗(y)=sup(yTx−f(x))f^*(y) = \sup (y^Tx - f(x)), x∈domf{x\in {\bf dom} f} 可见,共 ...
- 浅谈oracle树状结构层级查询测试数据
浅谈oracle树状结构层级查询 oracle树状结构查询即层次递归查询,是sql语句经常用到的,在实际开发中组织结构实现及其层次化实现功能也是经常遇到的,虽然我是一个java程序开发者,我一直觉得只 ...
- 单引号oracle如何转义_浅谈oracle中单引号转义
ORACLE 单引号转义: 在ORACLE中,单引号有两个作用: 1:字符串是由单引号引用 2:转义. 单引号的使用是就近配对,即就近原则.而在单引号充当转义角色时相对不好理解 1.从第二个单引号开始 ...
- 浅谈性能优化之图片压缩、加载和格式选择
原文链接:浅谈性能优化之图片压缩.加载和格式选择 在认识图片优化前,我们先了解下 [二进制位数]与[色彩呈现]的关系. 二进制位数与色彩 在计算机中,一般用二进制数来表示像素.在不同的图片格式中,像素 ...
- 浅谈Oracle RAC -- OHAS组件
浅谈Oracle RAC – OHAS组件 懒惰了一周没有更新博客.这两天天气不好,索性利用今天下午的时间继续写一篇关于OHAS组件的介绍. 之前我们多次提到了OHAS组件是GI的根守护进程.这个组件 ...
- 浅谈tomcat优化
前言 对于JavaWeb开发人员而言,Tomcat已成为默认的web服务器,但是在生产环境下使用Tomcat部署应用,我们如果采用Tomcat默认的配置,尤其是内存和线程的配置,其配置都很低,容易成为 ...
最新文章
- RHEL6.3安装vsftpd
- 假赋值java_Java十四天零基础入门-Java赋值运算符
- SQL SERVER 创建GHUID命令:select newid();
- Android Studio使用笔记
- NOJ---1408----map的运用
- 计算机学不学工程制图,大一,马上要考试了,不想再学工程制图了?
- spring配置数据库
- python兔子和獾_少儿编程分享:手把手教你用PYTHON编写兔獾大作战(三)
- sql批量插入防止重复插入_使用具有严格业务规则SQL批量插入
- jsx怎么往js里传参数_JSX语法使用详解——终极版
- Desktop imags
- [转]vc++ release 版的生成
- 软件测试的四个阶段【单元测试、集成测试、系统测试、验证测试】
- 数据分析方法(营销模型篇)--最全的9种分析方法
- ubuntu搜狗输入法切换快捷键fcitx设置
- mysql 单表数据量多大_MySQL单表到底可以多大
- Uniapp|Vue-汉字转拼音|获取汉字的首字母js实现
- (Tekla Structures二次开发)自动标注尺寸展示
- 2015美国大学计算机科学专业排名,2015美国大学本科计算机专业排名前一百
- 极简烟雨图床正式版源码V2.1.3/高速外链图床
热门文章
- pci-e服务器显卡性能,PCI-E带宽揭密 显卡究竟能吃多大的带宽
- Android性能测试工具Emmagee介绍
- vue 倒计时 插件_vue倒计时组件
- vue组件库开发遇到的regeneratorRuntime is not defined
- 随机抖音接口php,【php】下载抖音无水印视频接口
- 微信小程序----实现YDUI的ScrollNav组件(滚动导航)
- 系列学习 Lambda 表达式之第 2 篇 —— JDK1.8 的 Stream 流基本使用
- wps PPT 中提取视频
- 【干货】火山视频去水印下载使用介绍
- 一键轻松去除抖音火山等短视频水印~