Oracle 有个高速缓冲的概念,这个高速缓冲就是存放执行过的SQL语句,那oracle在执行sql语句的时候要做很多工作,例如解析sql语句,估算索引利用率,绑定变量,读取数据块等等这些操作。假设高速缓冲里已经存储了执行过的sql语句,那就直接匹配执行了,少了步骤,自然就快了,但是经过测试会发现高速缓冲只对简单的表起作用,多表的情况完全没有效果,例如在查询单表的时候那叫一个快,但是假设连接多个表,就龟速了。
最重要一点,ORACLE的高速缓冲是全字符匹配的,什么意思呢,看下面三个select

1,select * from tableA
2,select * From tableA
3,select * from tableA

这三个语句乍一看是一样的,但是高速缓存是不认的,是全字符匹配的,索引在高速缓存里会存储三条不同的语句,说到这里,又引出一个习惯,就是要保持良好的编程习惯,这个很重要

ORACLE多表查询常用的优化:

1,FROM子句后面的表顺序有讲究

先说为啥,ORACLE在解析sql语句的时候对FROM子句后面的表名是从右往左解析的,是先扫描最右边的表,然后在扫描左边的表,然后用左边的表匹配数据,匹配成功后就合并。 所以,在对多表查询中,一定要把小表写在最右边,为什么自己想想就明白了。例如下面的两个语句:

--No.1 tableA:100w条记录 tableB:1w条记录 执行速度十秒
select count(*) from tableA, tableB;

--No.2 执行速度百秒甚至更高
select count(*) from tableB, tableA;

这个估计很多人都知道,但是要确认非常有用。

还有一种是三张表的查询,例如

tableA 为交叉表,根据oracle对From子句从右向左的扫描方式,应该把交叉表放在最末尾,然后才是最小表(第二行)

--tableA a 交叉表
--tabelB b 100w
--tableC c 1w

1、select count(1) from tableA a,tableB b ,tableC c where a.id=b.id and a.id=c.id;
2、select count(1) from tableB b ,tableC c ,tableA a where a.id=b.id and a.id=c.id;

这种写法对大数据量会非常有用,也是很常用的

2,Where子句后面的条件过滤有讲究

ORACLE对where子句后面的条件过滤是自下向上,从右向左扫描的,所以和From子句一样一样的,把过滤条件排个序,按过滤数据的大小,自然就是最少数据的那个条件写在最下面,最右边,依次类推,例如

--No.1 不可取 性能低下
select * from tableA a where a.id>500 and a.lx = '2b' and a.id < (select count(1) from tableA where id=a.id)

--No.2 性能高
select * from tableA a where a.id < (select count(1) from tableA where id=a.id) and a.id>500 and a.lx = '2b'

3,使用select的时候少用*,多敲敲键盘,写上字段名吧,因为ORACLE的查询器会把*转换为表的全部列名,这个会浪费时间的,所以在大表中少用

4,充分利用rowid ,可以用rowid来分页,删除查询重复记录  

--oracle查找重复记录
select * from tableA a where a.rowid>=(select min(rowid) from tableB b where a.column=b.column)

--oracle删除重复记录
delete from tableA a where a.rowid>=(select min(rowid) from tableB b where a.column=b.column)

--分页 start=10 limit=10 end 为 start + limit
--1.查询要排列的表A
--2.查询A表的Rownum找出小于end的数据组成表B
--3.查询B表通过rownum找出大于start的数据完成
--简单的说先根据end值过滤数据,然后在根据start过滤数据
SELECT * FROM
(SELECT a.*, ROWNUM rn FROM (SELECT * FROM uim_serv_file_data ORDER BY OUID) a where ROWNUM<=20) b
where rn>10 order by ouid desc

5,存储过程中需要注意的,多用commit了,既可以释放资源,但是要谨慎

6,减少对数据库表的查询,这个很重要,能减少就减少,因为在执行语句的时候oracle会做很多初始工作

7,少用in,多用exists来代替

1,IN的写法         SELECT * FROM TABLEA A WHERE A.ID IN (SELECT ID FORM TABLEB B WHERE B.ID>1)
2,exists 写法      SELECT * FROM TABLEA A WHERE EXISTS (SELECT 1 FROM TABLEB B WHERE A.ID=B.ID AND B.ID>1)

Oracle 多表联合查询优化相关推荐

  1. oracle主从关系表查询,Oracle 主从表联合查询解决方法

    Oracle 主从表联合查询 表A id   type   name 1    E      AA 2    F 表B id   Aid    name 1    2      BB 2    2   ...

  2. oracle同时更新多列数据,ORACLE 11G 表联合更新多列

    -- ORACLE 11G  表联合更新多列 update apps.SGD_ACTUAL_WIP_COST cst set (cst.ITEM_ID,cst.WIP_ENTITY_ID,cst.ST ...

  3. oracle多表联合查询更新,ORACLE 两表关联更新三种方式

    不多说了,我们来做实验吧. 创建如下表数据 select * from t1 ; select * from t2; 现需求:参照T2表,修改T1表,修改条件为两表的fname列内容一致. 方式1,u ...

  4. Oracle多表联合查询

    -多表联合查询: –当需要获取的数据分布在多张中,考虑使用联合查询 –SQL92方式 –SQL99方式 –SQL92方式 –笛卡尔积:将多个表的数据进行一一对应,所得到结果为多表的笛卡尔积. –结果的 ...

  5. mysql大表联合查询优化,大事务优化,规避事务超时,锁等待超时与锁表

    背景:最近在做项目的同时做了一些优化,主要针对mysql大表(2亿+数据量未分库分表情况下)的联合查询以及生产上出现的一些事务超时和锁等待超时现象的优化,分享一些我个人的优化思路,只讲思路不贴代码哈. ...

  6. oracle创建表联合索引,Oracle创建索引的基本规则

    创建索引的基本规则 一.B-Tree索引 1. 选择索引字段的原则: 在WHERE子句中最频繁使用的字段 联接语句中的联接字段 选择高选择性的字段(如果很少的字段拥有相同值,即有很多独特值,则选择性很 ...

  7. ORACLE多表查询优化(引)

    这里提供的是执行性能的优化,而不是后台数据库优化器资料: 参考数据库开发性能方面的各种问题,收集了一些优化方案统计如下(当然,象索引等优化方案太过简单就不列入了,嘿嘿): 执行路径:ORACLE的这个 ...

  8. Oracle ODI 12c之多表联合查询以及定时任务设置

    本文介绍如何通过ODI进行多表联合查询并设置定时任务.准备工作如下: 准备物理方案和逻辑方案: 创建模型并通过"逆向工程"同步方案: 创建项目(根据实际情况创建或者使用现有的): ...

  9. ORACLE多表查询优化

    ORACLE有个高速缓冲的概念,这个高速缓冲就是存放执行过的SQL语句,那oracle在执行sql语句的时候要做很多工作,例如解析sql语句,估算索引利用率,绑定变量,读取数据块等等这些操作.假设高速 ...

最新文章

  1. lightgbm 决策树 可视化 graphviz
  2. c语言文件发送程序,C语言程序例程的文件结构
  3. 怎么还不见2005的中文版出来的?
  4. 【完整代码】使用Semaphore实现限流代码示例
  5. Redis如何淘汰过期的keys
  6. 我们可以无损放大一个Transformer模型吗?
  7. SAP UI5 应用开发教程之三十六 - 使用 Chrome 开发者工具 Elements 标签动态修改 CSS 类
  8. java 当中的验证码_Java Web中验证码的实现
  9. 【java】Java实现单向链表反转
  10. 关于网站购物车的实现的思考
  11. win10安装vc2015失败,尝试解决方案,目前有效
  12. 公司项目JAVA开发规范总结(七)——编程规范
  13. 记:谷歌开发者大会2022——共码未来
  14. 磊科NBR100企业有线路由器IP和Mac地址绑定教程
  15. 用JavaScript获取一年的天数
  16. DNS_PROBE_FINISHED_NXDOMAIN错误的解决方法
  17. CobaltStrike之Beacon命令使用
  18. 工业设备刀具检测常用特征值提取方法及决策方法
  19. 程序员们,千万不要接私活
  20. 错误 C2679 二进制“=”: 没有找到接受“const _Ty”类型的右操作数的运算符(或没有可接受的转换)的一种情况发生的错误

热门文章

  1. Chisel 教程翻译 之 第一章:概述介绍《Digital Design with Chisel》
  2. 计算机中英语单词翻译,计算机有关的英语单词及翻译
  3. pytorch实现AlexNet
  4. jupyter找不到模块_Jupyter notebook无法导入第三方模块的解决方式
  5. 让windows2008更加漂亮,为windows08启用vista主题,areo效果
  6. python读取一个文件并写入另一个文件_python2.x 文件读写
  7. VC++程序设计与应用--图形和文本输出
  8. 基于springboot的微信公众号管理系统(支持多公众号接入)
  9. python表白神器_python教程之抖音同款表白神器——Python让你的七夕更完美!
  10. 手机怎么解压php文件夹,手机怎么解压文件