• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase
您的位置:首页 > 数据库 >oracle > Oracle SQL性能优化系列学习二

Oracle SQL性能优化系列学习二

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-11

通过本文主要向大家介绍了Oracle SQL性能优化系列学习二等相关知识,希望本文的分享对您有所帮助
正在看的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] 

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

相关文章

  • 2017-05-11Oracle重建索引Shell脚本、SQL脚本分享
  • 2017-05-11怎么才能限制SQL Server只能让指定的机器连接
  • 2017-05-11Oracle监听器服务不能启动的解决方法
  • 2017-05-11Oracle数学相关函数小结
  • 2017-05-11JDBC连接集群数据库的方法
  • 2017-05-11Redhat 6.2 下 oracle 11g R2的安装详解第1/2页
  • 2017-05-11oracle数据库sql的优化总结
  • 2017-05-11oracle插入字符串数据时字符串中有'单引号问题
  • 2017-05-11oracle 查询当天数据的sql条件写法
  • 2017-05-11oracle 性能优化建议小结

文章分类

  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase

最近更新的内容

    • Oracle导出数据
    • ORACLE锁机制深入理解
    • Oracle中在pl/sql developer修改表的2种方法
    • 在oracle数据库里创建自增ID字段的步骤
    • oracle(plsql)生成流水号
    • 整理Oracle数据库中数据查询优化的一些关键点
    • Oracle中简单查询、限定查询、数据排序SQL语句范例和详细注解
    • [Oracle] dbms_metadata.get_ddl 的使用方法总结
    • 解决Hibernate JPA中insert插入数据后自动执行select last_insert_id()
    • Oracle例外用法实例详解

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有