Oracle学习(十三)优化专题
一、查询频繁,数据量大
索引
使用时机:表中经常查询的字段可以考虑添加索引。
- 联合索引:若能确认多个条件会同时使用时,可以将这几个条件作为联合索引。
- 单列索引:若条件查询时,这几个条件不是同时用到的话,还是单列做索引比较好些。
例子:
如:id,name,income三列需要做索引
查询时同时使用:联合索引要比单列索引要快。
查询时只用到一部分:单列索引要比联合索引快,但是实际上联合索引还是要比没有索引快。
- 在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引, 否则该索引将不会被使用。且尽可能的让字段顺序与索引顺序相一致。
- 若某列中存在大量重复数据(如状态,支付类型等列),那么建立索引对效率没啥影响。
- 在定义primary key或unique约束后系统自动在相应的列上创建索引。
用select 具体列代替 select *
- 查询时哪怕很多列也不要使用select*这种写法,这样会全表扫描。
- 应该是用到哪列就在哪列上面加入索引,然后查询时,写清楚要select的列,这样可以调用到对应列的索引,效率会高很多。
二、查询条件注意事项
null值处理
使用时机:当某列可能存在空值时,考虑使用默认值。
PS:在 where 子句中对字段进行 null 值判断,将导致引擎放弃使用索引而进行全表扫描!
例子: select id from t where num is null
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
select id from t where num = 0
OR、!=、<>、like 优化
使用时机:当查询中的过滤条件存在这几种过滤方式时,会导致引擎放弃使用索引而进行全表扫描,可以考虑以下优化方案。
例子:OR优化:
select id from t where num=10
union all
select id from t where num=20
LIKE优化:
尽量不要在where条件中使用两边都是%的like模糊查询,这样会导致全表扫描,实在不行在字段后面进行模糊匹配。如like 'li%'
IN 优化
使用时机:当查询中用到in的条件进行过滤时,可以考虑以下优化方案。
例子:IN优化:
对于连续的区间数据:使用between
select * from t_order where id between 2 and 3
对于不连续连续的区间数据:使用exists
select num from a where exists(select 1 from b where num=a.num)
三、字段类型的选择
字符型优化
1、若某列只存在数值型的数据,则该列的类型应设置为数值类型,这会降低查询和连接的性能,并会增加存储开销。
2、尽可能的使用 varchar(可变长度) 代替 char (固定长度),因为首先可变长度字段存储空间小,可以节省存储空间。
其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。
四、新增、修改优化
勤用commit
多使用commit来释放回滚点,对性能会有所提升,出错回滚时数据量也会相对少很多。
五、删除操作
删除操作有3种,先简单了解一下
drop table
1)属于DDL
2)不可回滚
3)不可带where
4)表的结构和内容都删除
5)删除速度快
使用时机:不再需要一张表的时候,用drop
truncate table
1)属于DDL
2)不可回滚
3)不可带where
4)表内容删除
5)删除速度快
使用时机:保留表而删除所有数据的时候用truncate
delete from
1)属于DML
2)可回滚
3)可带where
4)根据where对表内容删除
5)删除速度慢,需要逐行删除
使用时机:想删除部分数据行时候,用delete,并且带上where子句
六、SQL书写
使用大写
Oracle服务器总是先将小写字母转成大写后,才执行,所以使用大写时能减少Oracle的一步操作。
Oracle学习(十三)优化专题的更多相关文章
- Oracle之SQL优化专题01-查看SQL执行计划的方法
在我2014年总结的"SQL Tuning 基础概述"中,其实已经介绍了一些查看SQL执行计划的方法,但是不够系统和全面,所以本次SQL优化专题,就首先要系统的介绍一下查看SQL执 ...
- Oracle之SQL优化专题03-如何看懂SQL的执行计划
专题第一篇<Oracle之SQL优化专题01-查看SQL执行计划的方法>讲到了查看SQL执行计划的方法,并介绍了各种方法的应用场景,那么这一篇就主要介绍下如何看懂SQL的执行计划.毕竟如果 ...
- Oracle之SQL优化专题02-稳固SQL执行计划的方法
首先构建一个简单的测试用例来实际演示: create table emp as select * from scott.emp; create table dept as select * from ...
- Oracle学习(十三):闪回
1.知识点:能够对比以下的录屏进行阅读 SQL> --1. 错误地删除了记录 SQL> --2. 错误地删除了表 SQL> --3. 查询历史记录 SQL> --4. 怎样撤销 ...
- Oracle学习总结(8)—— 面向程序员的数据库访问性能优化法则
特别说明: 1. 本文只是面对数据库应用开发的程序员,不适合专业DBA,DBA在数据库性能优化方面需要了解更多的知识: 2. 本文许多示例及概念是基于Oracle数据库描述,对于其它关系型数据库也 ...
- Oracle学习线路
出自huyangg的博客,地址是:oracle学习路线图 1.sql.pl/sql(网上有很多的视频,可以做一个简单的入手,然后看几本书,多做实验) 作为oracle的基本功,需要大家对sql和 ...
- 从一条巨慢SQL看基于Oracle的SQL优化(重磅彩蛋+PPT)
本文根据DBAplus社群第110期线上分享整理而成,文末还有好书送哦~ 讲师介绍 丁俊 新炬网络首席性能优化专家 SQL审核产品经理 DBAplus社群联合发起人.<剑破冰山-Oracle开发 ...
- oracle数据库性能优化方案精髓整理收集回想
oracle数据库性能优化整体法则: 一.降低数据訪问(降低硬盘房訪问次数) 二.返回更少的数据(降低网络传输或磁盘訪问) 三.降低交互次数(降低网络传输) 四.降低server开销(降低cpu及内存 ...
- Oracle学习笔记—数据字典和常用命令(转载)
转载自: oracle常用数据字典和SQL语句总结 Oracle常用命令大全(很有用,做笔记) 一.Oracle数据字典 数据字典是Oracle存放有关数据库信息的地方,其用途是用来描述数据的.比如一 ...
- Oracle学习笔记三 SQL命令
SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)
随机推荐
- ubuntu 构建 deb 安装包
源码包下载:http://mirrors.163.com/ubuntu/ 编译工具安装: apt-get install dpkg-dev 以openvswitch为例: wget http://mi ...
- 安国AU6989主控 + K9GBG08U0A(NAND) 制作4GB闪存驱动器
文档标识符:AU6989_FLASH-DRIVE_D-P8 作者:DLHC 最后修改日期:2020.8.22 本文链接: https://www.cnblogs.com/DLHC-TECH/p/AU6 ...
- DevOps系列(1)-总体架构
扯闲淡 在进入正式话题之前,先扯个淡,这算是第一篇我正式在博客上发布的随笔吧,之前也一直有想写点什么,将自己多年的工作经验分享出来,供大家参考点评,但是奈何一直对自己的文字功底不自信(其实也确实比较烂 ...
- typedef的陷阱
typedef定义了一种类型的新别名,不同于宏,它不是简单的字符串替换.比如: 先定义: typedef char* PSTR; 然后: int mystrcmp(const PSTR, const ...
- JVM-Java创建对象过程
关键字:类加载过程.内存分配 指针碰撞法.空间列表法.CAS.TLAB.初始化.对象头 Java对象创建方式(不包含数组和Class对象创建): new指令 反射调用 反序列化 对象创建过程 遇到ne ...
- 数字电路基础(二)TTL与非门输入端悬空和接大电阻的问题
引言 我们在做那些判断与非门输入输出的时候,常常把输入端悬空和接大电阻作为高电平输入处理,比如下边这一例题: 很显然,我们无法直接从与非门逻辑图中看出其内部工作原理,那我们该如何分析呢?那肯定是去分析 ...
- 高可用集群corosync+pacemaker之crmsh使用(二)
上一篇博客我们聊到了crmsh的安装以及配置一个资源到corosync+pacemaker高可用集群上的相关命令的用法,回顾请参考https://www.cnblogs.com/qiuhom-1874 ...
- 良许被百万大V安排得服服帖帖,还跟美女小姐姐合影了……
大家好,我是良许. 很多人问我说,良许,你在工作之余还花这么多时间精力去写公众号运营自媒体,到底是为了什么? 其实原因很简单,就是想做个副业,万一到了 35 岁真的失业了,我至少还有另外一份收入,不至 ...
- Ocelot+Consul实现微服务架构
API网关 API 网关一般放到微服务的最前端,并且要让API 网关变成由应用所发起的每个请求的入口.这样就可以明显的简化客户端实现和微服务应用程序之间的沟通方式.以前的话,客户端不得不去请求微服务A ...
- 18_Python常用的模块中的某个方法
1.imp模块==========>重新加载已加载过的模块方法 import imp imp.reload(mymod) # 重新加载已经加载过的mymod模块 2.ctypes模块====== ...