ORACLE SQL语句共享

Oracle 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优化的规则请参考:

http://www.cnblogs.com/rootq/archive/2008/11/17/1334727.html

 

 

ORACLE SQL性能优化汇总的更多相关文章

  1. Oracle SQL性能优化技巧大总结

    http://wenku.baidu.com/link?url=liS0_3fAyX2uXF5MAEQxMOj3YIY4UCcQM4gPfPzHfFcHBXuJTE8rANrwu6GXwdzbmvdV ...

  2. ORACLE SQL性能优化(全)

    ORACLE SQL性能优化(全) http://wenku.baidu.com/view/b2aaba3887c24028915fc337.html

  3. Oracle SQL 性能优化技巧

    Select语句完整的执行顺序: SQL Select语句完整的执行顺序: 1. from子句组装来自不同数据源的数据: 2.where子句基于指定的条件对记录行进行筛选: 3.group by子句将 ...

  4. Oracle SQL性能优化总结

    1. SQL语句执行步骤 语法分析> 语义分析> 视图转换 >表达式转换> 选择优化器 >选择连接方式 >选择连接顺序 >选择数据的搜索路径 >运行“执 ...

  5. Oracle SQL性能优化的40条军规

    1. SQL语句执行步骤 语法分析> 语义分析> 视图转换 >表达式转换> 选择优化器 >选择连接方式 >选择连接顺序 >选择数据的搜索路径 >运行“执 ...

  6. Oracle SQL性能优化系列

    1. 选用适合的ORACLE优化器 ORACLE的优化器共有3种: a. RULE (基于规则) b. COST (基于成本) c. CHOOSE (选择性) 设置缺省的优化器,可以通过对init.o ...

  7. Oracle SQL性能优化 - 根据大表关联更新小表

    需求: 小表数据量20w条左右,大表数据量在4kw条左右,需要根据大表筛选出150w条左右的数据并关联更新小表中5k左右的数据. 性能问题: 对筛选条件中涉及的字段加index后,如下常规的updat ...

  8. Oracle SQL性能优化

    (1)      选择最有效率的表名顺序(只在基于规则的优化器中有效):ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table) ...

  9. Oracle SQL性能优化(转)

    (1)      选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table ...

随机推荐

  1. jsPlumb 基本概念

    jsPlumb 基本概念 一.默认属性 Anchor:锚点(连接点位置),可以设置在任何没有锚点的目标上(endPoint) Anchors:设置在connect的源和目标点的连接点位置,默认是 Bo ...

  2. iOS-UITextField和UITextView隐藏键盘

    UITextField和UITextView隐藏键盘 71 views, IOS DEV, by admin. self._textField.returnKeyType=UIReturnKeyDon ...

  3. office word 設置默認的縮放為100%, office word set default Zoom to 100% permanently

    如題,今天剛好遇到一個老師不知道什麽原因造成Microsoft office word 每次打開都會縮放到70% ,所以google 了一下,還真有解決方法. 只要將默認的 使用者範本檔 Normal ...

  4. 最新 小红书java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.小红书等10家互联网公司的校招Offer,因为某些自身原因最终选择了小红书.6.7月主要是做系统复习.项目复盘.LeetCo ...

  5. 【leetcode算法-简单】66. 加一

    [题目描述] 给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一. 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字. 你可以假设除了整数 0 之外,这个整数不会以零开头. 示 ...

  6. 阿里三面46题:java高级+数据库+网络+架构设计!含答案大赠送!

    阿里一面 自我介绍 链表,数组的优缺点,应用场景,查找元素的复杂度 二叉树怎么实现的 Java中都有哪些锁 可重入锁的设计思路是什么 乐观锁和悲观锁 synchronized机制 hashmap原理, ...

  7. python读写文件的操作

    编程语言中,我们经常会和文件和文件夹打交道,这篇文章主要讲的是Python中,读写文件的常用操作: 一.打开文件 openFile = open('../Files/exampleFile.txt', ...

  8. PAT(B) 1010 一元多项式求导(Java)

    题目链接:1010 一元多项式求导 代码 /** * Score 25 * Run Time 94ms * @author wowpH * @version 1.1 */ import java.ut ...

  9. 初始STM32

    主要内容: 1.什么是STM32 STM32有什么 STM32怎么选型号 一:什么是STM32 ST— 意法半寻体,是一个公司名,即SOC厂商(ARM是IP厂商,STM32中内核由ARM设计,外设例如 ...

  10. python中列表之间求差集、交集、并集

    求两个列表的交集.并集.差集 def diff(listA, listB): # 求交集的两种方式 retA = [i for i in listA if i in listB] retB = lis ...