动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
电脑书籍下载:程序设计书籍 | 数据库教程书籍 | 平面与多媒体书籍 | 网络通讯书籍 | 系统管理书籍 | 网络安全书籍 | 认证考试书籍
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > Oracle教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Oracle教程 ]的信息



本月文章推荐
.关于Oracle数据库中密码安全管理.
.漫谈数据库的启动和关闭.
.如何在SQL *Plus中把数据库栏以变.
.Oracle是如何工作的.
.Oracle中password file的作用及说.
.Oracle10g安装升级以及新特性介绍.
.把应用程序程序和ORACLE客户端一.
.一个关于如何解决复杂编码的挑战.
.Oracle Fail Safe Step-By-Step .
.全面解析Oracle数据库中管理实例.
.Oracle 9i Data Guard进行数据库.
.利用散列法来处理大的静态统一表.
.Oracle体系框架及SQL语句性能完全.
.ORACEL起动方法及一般问题.
.ORACLE常用傻瓜问题1000问(之九).
.about kernel exploit.
.在RHAS4下安装oracle 10G.
.oracle的几个使用技巧.
.ORACLE PERFORMANCE SQL TUNING.
.返回指定行数之间的查询结果.

Oracle9i 的查询优化

发表日期:2008-2-9 |



  执行概要
  本文描述了Oracle 的查询优化程序,它是数据库的要害组件,能让Oracle 的用户获得极佳的执行性能。Oracle 的查询优化技术在功能上无与伦比,本文具体讨论了查询优化的所有重要领域。
  简介
  什么是查询优化程序?
  查询优化对于关系数据库的性能,非凡是对于执行复杂SQL 语句的性能而言至关重要。查询优化程序确定执行每一次查询的最佳策略。
  例如,查询优化程序选择对于指定的查询是否使用索引,以及在联接多个表时采用哪一种联接技术。这类决策对SQL 语句的执行性能有很大的影响,查询优化对于每一种应用程序都是要害技术,应用程序涉及的范围从操作系统到数据仓库,从分析系统到内容治理系统。查询优化程序对于应用程序和最终用户是完全透明的。
  由于应用程序可能生成非常复杂的SQL 语句, 查询优化程序必须精心构建、功能强大,以保障良好的执行性能。例如,查询优化程序可转换SQL 语句,使复杂的语句转换成为等价的但执行性能更好的SQL 语句。查询优化程序的典型特征是基于开销。在基于开销的优化策略中,对于给定查询生成多个执行计划,然后对每个计划估算开销。查询优化程序选用估算开销最低的计划。
  Oracle 在查询优化方面提供了什么?
  Oracle 的优化程序可称是业界最成功的优化程序。基于开销的优化程序自1992 年随Oracle7 推出后,通过10 年的丰富的实际用户经验,不断得到提高和改进。好的查询优化程序不是基于纯粹的理论假设及谓词在实验室中开发出来的,而是通过适合实际用户需求开发和磨合出来的。
  Oracle 的查询优化程序比任何其他查询优化程序在数据库应用程序的应用都要多,而且Oracle 的优化程序一直由于实际应用的反馈而得到改进。
  Oracle 的优化程序包含4 大主要部分(本文将在以下章节具体讨论这些部分):
  SQL 语句转换:在查询优化中Oracle 使用一系列精深技术对SQL 语句进行转换。查询优化的这一步骤的目的是将原有的SQL 语句转换成为语义相同而处理效率更高的SQL 语句。
  执行计划选择:对于每个SQL 语句, 优化程序选择一个执行计划(可使用Oracle 的EXPLAIN PLAN 工具或通过Oracle 的“v$sql_plan” 视图查看)。执行计划描述了执行SQL 时的所有步骤,如访问表的顺序;如何将这些表联接在一起;以及是否通过索引来访问这些表。优化程序为每个SQL 语句设计许多可能的执行计划,并选出最好的一个。
  开销模型与统计:Oracle 的优化程序依靠于执行SQL 语句的所有单个操作的开销估算。想要优化程序能选出最好的执行计划,需要最好的开销估算方法。开销估算需要具体了解某些知识,这些知识包括:明白每个查询所需的I/O、CPU 和内存资源以及数据库对象相关的统计信息(表、索引和物化视图),还有有关硬件服务器平台的性能信息。收集这些统计和性能信息的过程应高效并且高度自动化。
  动态运行时间优化:并不是SQL 执行的每个方面都可以事先进行优化。Oracle 因此要根据当前数据库负载对查询处理策略进行动态调整。该动态优化的目标是获得优化的执行性能,即使每个查询可能不能够获得理想的CPU 或内存资源。Oracle 另有一个原来的优化程序,即基于规则的优化程序。该优化程序仅向后兼容,在Oracle 的下个版本将不再得到支持。绝大多数Oracle 用户目前使用基于开销的优化程序。所有主要的应用程序供给商(如Oracle 应用程序、SAP 和Peoplesoft,仅列出这几家)以及大量近来开发的客户应用程序都使用基于开销的优化程序来获得优良的执行性能,故本文仅讲述基于开销的优化程序。
  SQL 语句转换
  使用SQL 语句表示复杂查询可以有多种方式。提交到数据库的SQL 语句类型通常是最终用户或应用程序可以最简单的方式生成的SQL 类型。但是这些人工编写或机器生成的查询公式不一定是执行查询最高效的SQL 语句。例如,由应用程序生成的查询通常含有一些无关紧要的条件,这些条件可以去掉。或者,有些从某查询谓词出的附加条件应当添加到该SQL 语句中。SQL 转换语句的目的是将给定的SQL 语句转换成语义相同(即返回相同结果的SQL 语句)并且性能更好的SQL 语句。
  所有的这些转换对应用程序及最终用户完全透明。SQL 语句转换在查询优化过程中自动实现。
  Oracle 实现了多种SQL 语句转换。这些转换大概可分成两类:
  试探查询转换:在可能的情况下对进来的SQL 语句都会进行这种转换。这种转换能够提供相同或较好的查询性能,所以Oracle 知道实施这种转换不会降低执行性能。 基于开销的查
  询转换:Oracle 使用基于开销的方法进行几类查询转换。借助这种方法,转换后的查询会与原查询相比较,然后Oracle 的优化程序从中选出最佳执行策略。
  以下部分将讨论Oracle 转换技术的几个示例。这些示例并非是权威的,仅用于帮助读者理解该要害转换技术及其益处。
  试探查询转换
  简单视图合并
  可能最简单的查询转换是视图合并。对于包含视图的查询,通常可以通过把视图定义与查询“合并”来将视图从查询中去掉。例如,请看下面的非常简单的视图及查询。
  CREATE VIEW TEST_VIEW AS SELECT ENAME, DNAME, SAL FROM EMP E, DEPT D WHERE E.DEPTNO = D.DEPTNO;
  SELECT ENAME, DNAME FROM TEST_VIEW WHERE SAL > 10000;
  假如不加任何转换,处理该查询的唯一方法是将EMP 的所有行联接到DEPT 表的所有行,然后筛选有适当的SAL 的值的那些行。

  假如使用视图合并,上述查询可以转换为:
  SELECT ENAME, DNAME FROM EMP E, DEPT D WHERE E.DEPTNO = D.DEPTNO AND E.SAL > 10000;
  处理该转换后的查询时,可以在联接EMP 和DEPT 表前使用谓词‘SAL>10000’。这一转换由于减少了联接的数据量而大大提高了查询的执行性能。即便在这样一个非常简单的示例里,查询转换的益处和重要性也显而易见。
  复杂视图合并
  许多视图合并操作都是直截了当的,如以上示例。但是,较复杂的视图,如包含GROUP BY 或DISTINCT 操作符的视图合并起来就不那么轻易了。Oracle 为合并这类复杂视图提供了一些高级技术。
  请看以下带有GROUP BY 语句的视图。在该示例中,视图计算每个部门的平均工资。
  CREATE VIEW AVG_SAL_VIEW AS SELECT DEPTNO, AVG(SAL) AVG_SAL_DEPT FROM EMP GROUP BY DEPTNO
  查询的目的是要找出Oakland 每个部门的平均工资:
  SELECT DEPT.NAME, AVG_SAL_DEPT FROM DEPT, AVG_SAL_VIEW WHERE DEPT.DEPTNO = AVG_SAL_VIEW.DEPTNO AND DEPT.LOC = 'OAKLAND'
  可以转换为:
  SELECT DEPT.NAME, AVG(SAL) FROM DEPT, EMP WHERE DEPT.DEPTNO = EMP.DEPTNO AND DEPT.LOC = 'OAKLAND' GROUP BY DEPT.ROWID, DEPT.NAME
  该非凡转换的执行性能优点立即显现:该转换把EMP 数据在分组聚合前进行联接和筛选,而不是在联接前将EMP 表的所有数据分组聚合。
  子查询“展平”
  Oracle 有一些转换能将不同类型的子查询转变为联接、半联接或反联接。作为该领域内的技术示例,我们来看下面这个查询,找出有工资超过10000 的员工的那些部门:
  SELECT D.DNAME FROM DEPT D WHERE D.DEPTNO IN (SELECT E.DEPTNO FROM EMP E WHERE E.SAL > 10000)
  存在一系列可以优化本查询的执行计划。Oracle 会考虑这些可能的不同转换,基于开销选出最佳计划。
  假如不进行任何转换,这一查询的执行计划如下:
  OPERATION OBJECT_NAME OPTIONS
  SELECT STATEMENT
  FILTER
  TABLE Access DEPT FULL
  TABLE ACCESS EMP FULL
  按照该执行计划,将扫描DEPT 表的每一行查找所有满足子查询条件的EMP 记录。通常,这不是一种高效的执行策略。然而,查询转换可以实现效率更高的计划。
  该查询的可能计划之一是将查询作为“半联接”来执行。“半联接”是一种非凡类型的联接,它消除了联接中来自内表的冗余值(这实际上就是该子查询的原本的语义)。在该示例中,优化程序选择了一个散列半联接,尽管Oracle 也支持排序-合并以及嵌套-循环半联接:
  OPERATION OBJECT_NAME OPTIONS
  SELECT STATEMENT
  HASH JOIN SEMI
  TABLE ACCESS DEPT FULL
  TABLE ACCESS EMP FULL
  由于SQL 没有用于半联接的直接语法,此转换过的查询不能使用标准的SQL 来表示。但是,转换后的伪SQL 将是:
  SELECT DNAME FROM EMP E, DEPT D WHERE D.DEPTNO E.DEPTNO AND E.SAL > 10000;
  另一个可能的计划是优化程序可以决定将DEPT 表作为联接的内表。在这种情况下,查询作为通常的联接来执行,但对EMP 表进行非凡排序,以消除冗余的部门号:
  OPERATION OBJECT_NAME OPTIONS
  SELECT STATEMENT
  HASH JOIN
  SORT UNIQUE
  TABLE ACCESS EMP FULL
  TABLE ACCESS DEPT FULL
  转换后的SQL 语句为:
  SELECT D.DNAME FROM (SELECT DISTINCT DEPTNO FROM EMP) E, DEPT D WHERE E.DEPTNO = D.DEPTNO AND E.SAL > 10000;
  与视图合并一样,子查询展平也是获得良好查询执行性能的基本优化办法。
  传递谓词生成
  在某些查询中,由于表间的联接关系,一个表中的谓词可以转化为另一个表中的谓词。Oracle 会以这种方式演绎出新的谓词,这类谓词被称为传递谓词。例如,来看一个查询,找出定货当天运出的所有商品:
  SELECT COUNT(DISTINCT O_ORDERKEY) FROM ORDER, LINEITEM WHERE O_ORDERKEY = L_ORDERKEY AND O_ORDERDATE = L_SHIPDATE AND O_ORDERDATE BETWEEN '1-JAN-2002' AND '31-JAN-2002'
  利用传递性,该ORDER 表中的谓词也可以用于LINEITEM 表:
  SELECT COUNT(DISTINCT O_ORDERKEY) FROM ORDER, LINEITEM WHERE
上一篇:优化策略 人气:512
下一篇:Inside Oracle9i Tablespace Management 人气:278
浏览全部Oracle教程的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-7-24 Sablog-X v2.0 预览版
2008-7-24 帝国备份王EmpireBak 2008 正式版
2008-7-24 网趣网上购物系统时尚版 v8.2
2008-7-24 纵横B2B电子商务系统XYECS!B2B v
2008-7-24 e路小说小偷 v1.2.0723
2008-7-24 凌风美女图片站程序 v2.2
2008-7-24 TOM15电影收索程序
2008-7-24 清风信息自动采集生成系统 v1.0
2008-7-24 QQ邮箱编辑器 v1.0 (小小菜刀ASP
2008-7-19 UltraEdit 简体中文增强版 14.10
2008-7-19 CentOS 5.2 i386 LiveCD
2008-7-19 Snapture多功能相机 v1.4
2008-7-19 iAcces中文输入法 v1.0Build016
2008-7-19 Cookbook烹饪秘籍 v2.5
2008-7-19 苹果专用DVD转换工具 v1.1.59汉化
2008-7-19 Modem修复软件ZiPhone修改版04.0
2008-7-19 AgileMessenger即时通讯工具美化
2008-7-19 Sketches画图软件 v0.7b6破解版


  发表评论
姓 名: 验证码:
内 容:
[ 汉字翻译拼音 ] [ 广告代码 ] [ 符号对照表 ] [ 进制转换 ] [ 经典小工具 ] [ 个税计算 ] [ 汉字简繁转换 ] [ 普通单位换算 ] [ 公制单位换算 ]
[ 生辰老黄历 ] [ 国内电话区号 ] [ 国家代码与域名缩写 ] [ 文字加密解密 ] [ 健康查询 ] [ 万年历 ] [ 手机号码查询 ] [ ip搜索 ] [ Google PR查询 ]
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵