博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ORACLE SQL性能优化汇总
阅读量:6241 次
发布时间:2019-06-22

本文共 2118 字,大约阅读时间需要 7 分钟。

ORACLE SQL语句共享

SQL语句具备共享特性,为了不让ORACLE重复解析相同的简单单表SQL语句,ORACLE在SGA系统共享区域内SBP共享池内存放的SQL语句将被所有用户共享。(注:只适合单表查询,多表连接查询无效!)

ORACLE SQL语句共享,表现在三个方面
1.字符级共享
可简单理解为 SQL语句大小写区分
如:
select * from employee;
select * From employee;
Select * from Employee;
以上三条语句ORACEL解析器会认为是三条不同的SQL语句,即不能共享
2.绑定变量必须相同
如:
A
1.select  username,password from user where id=:uid
2.select  username,password from user where id=:uid
B
1.select  username,password from user where id=:uid
2.select  username,password from user where id=:Kid
A两条语句可共享,B两条语句绑定不同,不可共享
3.语句所指对象必完全相同
用户            对象                        访问权限
ROOT             TAB1                      private
                 TAB2                      public
###############################
AVEN             TAB1                      private
                 TAB2                      public
 SQL语句
Q1. SELECT COUNT(*) FROM TAB1 ,不可共享,每一个用户有自己私有的表TAB1
Q2. SELECT COUNT(*) FROM TAB2 ,可共享

 

ORACLE SQL 多表联合查询

ORACLE在多表查询时,选择合适的基础表进行查询,SQL效率会比较高!
所谓基础表,是指在排在from后面的表列当中,最后一个位置的表称为基础表。
ORACLE解析器在处理FROM子句时,会从FROM后面的最后一个表开始向前依次连接查询
如selec t a.name ,b.code,c.content from A a,B b,C c where 。。。时,会先查询C表,再与B表连接,最后与A表连接查询。
所以要选择适当的表作为基础表,放到from最后一个位置。
在此处我们假设各表的记录数大小顺序为A<B<C表
则优化语句不应该像以上SQL那样子写
最优写法:selec t a.name ,b.code,c.content from  C c,B b,A a where 。。。
最后要说明一点:对于交叉表查询,所谓交叉关联表作为基础表进行查询最优。所谓交叉表,举学生选课为例来说,学生表,课程表,选课情况表,这三张表当中,选课情况表为交叉表,应作为基础表进行查询。

where语句条件顺序

 

SQL语句中,where子句后面的所带的条件的顺序带来的优化!

ORACLE解析器采用自下而上的方式解析WHERE子句。
根据这一原理,我们应将能够一下过滤掉最大数量的条件应尽可能地放在WHERE子句的最后面,而对于关联表的连接查询,像这样的条件,刚尽可能地放在WHERE子句前面。
举例说明,EMP员工表,MGR主管表,EMP的mrg_id为MGR表主键
查询年纪大于50岁并且主管是‘XXX’的记录时。
低效情况:
select name,age from emp where age>50 and mrg_id in select(select id from mrg where name='xxx') ;
高效情况:
select name,age from emp where mrg_id in select(select id from mrg where name='xxx') and age>50;

select 列引用符“*”

在使用select语句时,避免使用动态sql语句列引用符“*”,当使用这个“*”,是一种相当低效的方法,oracle会先对对应的表所有列名解析一遍,那样子会相当的慢慢,最高效的方法是,在用到哪些列名时,直接写列名查询。最后还有一个注意点,在使用count内部函数时,也不用轻易使用“*”,改为select(pk) from tab_name去查询。

ORACEL多表连接查询指定表别名alias

建议在ORACEL多表连接查询时,所要查询出来字段前使用别名alias,使用别名的好处有两个

第一,避免多表间存在同名列,而报错。举例,A表有字段c_column,B表也有字段c_column,SQL语句(select c_column from A,B WHERE XXXX)时,会报错,无法知道c_column归属哪张表
第二,减少数据库解析时间,指定了别名,数据库解析器直接去查别名所在名的字段,加快查询速度。

还有很多有关 oracle sql优化的规则请参考:

 

 

 

转载于:https://www.cnblogs.com/harveylv/p/6829277.html

你可能感兴趣的文章
深入了解JVM虚拟机8:Java的编译期优化与运行期优化
查看>>
使用Nagios打造专业的业务状态监控
查看>>
单例模式(java&iOS)
查看>>
重拾Java(8)-反射
查看>>
有没有可以共享的桌面便签?
查看>>
Mars说光场(3)— 光场采集
查看>>
24、商品列表页之数据渲染和传值
查看>>
源码分析-react3-创建dom
查看>>
C# 获取QQ好友列表信息的实现
查看>>
System.ComponentModel.Win32Exception解决方案
查看>>
设计模式之死磕策略模式(原创)
查看>>
IDEA无法导入Maven工程
查看>>
谈谈FLUX的使用
查看>>
4-Java面向对象-继承(上)
查看>>
mysql 生成随机手机号和随机中文名
查看>>
磁盘 IO 和网络 IO 该如何评估、监控、性能定位和优化?
查看>>
【iOS 开发】父视图外部子视图点击响应 - hitTest
查看>>
Android仿简书长按文章生成图片效果
查看>>
linux安装redis内存数据库
查看>>
官方实锤!微软宣布以 75 亿美元收购 GitHub
查看>>