侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

Oracle SQL性能优化系列学习二

数据库  /  管理员 发布于 6年前   148

正在看的ORACLE教程是:Oracle SQL性能优化系列学习二。 
4. 选择最有效率的表名顺序(只在基于规则的优化器中有效) 

  ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先处理. 在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.当ORACLE处理多个表时, 会运用排序及合并的方式连接它们.首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行派序,然后扫描第二个表(FROM子句中最后第二个表),最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并. 

  例如: 

  表 TAB1 16,384 条记录 

  表 TAB2 1 条记录 

  选择TAB2作为基础表 (最好的方法) 

select count(*) from tab1,tab2 执行时间0.96秒  

  选择TAB2作为基础表 (不佳的方法) 

select count(*) from tab2,tab1 执行时间26.09秒  

  如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表. 

  例如: 

  EMP表描述了LOCATION表和CATEGORY表的交集. 

SELECT * 

FROM LOCATION L , 

CATEGORY C, 

EMP E 

WHERE E.EMP_NO BETWEEN 1000 AND 2000 

AND E.CAT_NO = C.CAT_NO 

AND E.LOCN = L.LOCN  

  将比下列SQL更有效率 

SELECT * 

FROM EMP E , 

LOCATION L , 

CATEGORY C 

WHERE E.CAT_NO = C.CAT_NO 

AND E.LOCN = L.LOCN 

AND E.EMP_NO BETWEEN 1000 AND 2000  

  5. WHERE子句中的连接顺序. 

  ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾. 

  例如: (低效,执行时间156.3秒) 

SELECT … 

FROM EMP E 

WHERE SAL > 50000 

AND JOB = ‘MANAGER' 

AND 25 < (SELECT COUNT(*) FROM EMP 

WHERE MGR=E.EMPNO);  

  (高效,执行时间10.6秒) 

SELECT … 

FROM EMP E 

WHERE 25 < (SELECT COUNT(*) FROM EMP 

WHERE MGR=E.EMPNO) 

AND SAL > 50000 

AND JOB = ‘MANAGER';  

  6. SELECT子句中避免使用 ‘ * ‘ 

  当你想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用 ‘*' 是一个方便的方法.不幸的是,这是一个非常低效的方法. 实际上,ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间. 

  7. 减少访问数据库的次数 

  当执行每条SQL语句时, ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等等. 由此可见, 减少访问数据库的次数 , 就能实际上减少ORACLE的工作量. 

  例如, 以下有三种方法可以检索出雇员号等于0342或0291的职员. 

  方法1 (最低效) 

SELECT EMP_NAME , SALARY , GRADE 

FROM EMP 

WHERE EMP_NO = 342; 

SELECT EMP_NAME , SALARY , GRADE 

FROM EMP 

WHERE EMP_NO = 291;  

  方法2 (次低效) 

DECLARE 

CURSOR C1 (E_NO NUMBER) IS 

SELECT EMP_NAME,SALARY,GRADE 

FROM EMP 

WHERE EMP_NO = E_NO; 

BEGIN 

OPEN C1(342); 

FETCH C1 INTO …,..,.. ; 

….. 

OPEN C1(291); 

FETCH C1 INTO …,..,.. ; 

CLOSE C1; 

END;  

  方法3 (高效) 

SELECT A.EMP_NAME , A.SALARY , A.GRADE, 

B.EMP_NAME , B.SALARY , B.GRADE 

FROM EMP A,EMP B 

WHERE A.EMP_NO = 342 

AND B.EMP_NO = 291;  

  注

[1] [2] 下一页

正在看的ORACLE教程是:Oracle SQL性能优化系列学习二。意: 

  在SQL*Plus , SQL*Forms和Pro*C中重新设置ARRAYSIZE参数, 可以增加每次数据库访问的检索数据量 ,建议值为200。 

上一页  [1] [2] 


  • 上一条:
    oracle快速删除重复的记录
    下一条:
    用Oracle并行查询发挥多CPU的威力
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 分库分表的目的、优缺点及具体实现方式介绍(0个评论)
    • DevDB - 在 VS 代码中直接访问数据库(0个评论)
    • 在ubuntu系统中实现mysql数据存储目录迁移流程步骤(0个评论)
    • 在mysql中使用存储过程批量新增测试数据流程步骤(0个评论)
    • php+mysql数据库批量根据条件快速更新、连表更新sql实现(0个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2017-06
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-11
    • 2018-01
    • 2018-05
    • 2018-10
    • 2018-11
    • 2020-02
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2021-02
    • 2021-04
    • 2021-07
    • 2021-08
    • 2021-11
    • 2021-12
    • 2022-02
    • 2022-03
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-07
    • 2023-08
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-03
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客