设为首页 收藏本站
查看: 1213|回复: 0

[经验分享] Oracle SQL语句处理的过程(一)

[复制链接]

尚未签到

发表于 2018-9-14 07:32:52 | 显示全部楼层 |阅读模式
  在调整之前我们需要了解一些背景知识,只有知道这些背景知识,我们才能更好的去调整sql语句。
  本节介绍了SQL语句处理的基本过程,主要包括:
  . 查询语句处理
  . DML语句处理(insert, update, delete)

  . DDL 语句处理(create , drop ,>  . 事务控制(commit, rollback)
  一、SQL 语句的执行过程(SQL Statement Execution)
  图3-1 概要的列出了处理和运行一个sql语句的需要各个重要阶段。在某些情况下,Oracle运行sql的过程可能与下面列出的各个阶段的顺序有所不同。如DEFINE阶段可能在FETCH阶段之前,这主要依赖你如何书写代码。
  对许多oracle的工具来说,其中某些阶段会自动执行。绝大多数用户不需要关心各个阶段的细节问题,然而,知道执行的各个阶段还是有必要的,这会帮助你写出更高效的SQL语句来,而且还可以让你猜测出性能差的SQL语句主要是由于哪一个阶段造成的,然后我们针对这个具体的阶段,找出解决的办法。
DSC0000.jpg

  图 3-1 SQL语句处理的各个阶段
  二、DML语句的处理
  本节给出一个例子来说明在DML语句处理的各个阶段到底发生了什么事情。
  假设你使用Pro*C程序来为指定部门的所有职员增加工资。程序已经连到正确的用户,你可以在你的程序中嵌入如下的SQL语句:
  EXEC SQL UPDATE employees
  SET salary = 1.10 * salary
  WHERE department_id = :var_department_id;
  var_department_id是程序变量,里面包含部门号,我们要修改该部门的职员的工资。当这个SQL语句执行时,使用该变量的值。
  每种类型的语句都需要如下阶段:
  . 第1步: Create a Cursor   创建游标
  . 第2步: Parse the Statement 分析语句
  . 第5步: Bind Any Variables  绑定变量
  . 第7步: Run the Statement  运行语句
  . 第9步: Close the Cursor   关闭游标
  如果使用了并行功能,还会包含下面这个阶段:
  . 第6步: Parallelize the Statement  并行执行语句
  如果是查询语句,则需要以下几个额外的步骤,如图 3所示:
  . 第3步: Describe Results of a Query  描述查询的结果集
  . 第4步: Define Output of a Query   定义查询的输出数据
  . 第8步: Fetch Rows of a Query    取查询出来的行
  下面具体说一下每一步中都发生了什么事情:
  第1步: 创建游标(Create a Cursor)
  由程序接口调用创建一个游标(cursor)。任何SQL语句都会创建它,特别在运行DML语句时,都是自动创建游标的,不需要开发人员干预。多数应用中,游标的创建是自动的。然而,在预编译程序(pro*c)中游标的创建,可能是隐含的,也可能显式的创建。在存储过程中也是这样的。
  第2步:分析语句(Parse the Statement)
  在语法分析期间,SQL语句从用户进程传送到Oracle,SQL语句经语法分析后,SQL语句本身与分析的信息都被装入到共享SQL区。在该阶段中,可以解决许多类型的错误。
  语法分析分别执行下列操作:
  .翻译SQL语句,验证它是合法的语句,即书写正确
  .实现数据字典的查找,以验证是否符合表和列的定义
  .在所要求的对象上获取语法分析锁,使得在语句的语法分析过程中不改变这些对象的定义
  .验证为存取所涉及的模式对象所需的权限是否满足
  .决定此语句最佳的执行计划
  .将它装入共享SQL区
  .对分布的语句来说,把语句的全部或部分路由到包含所涉及数据的远程节点
  以上任何一步出现错误,都将导致语句报错,中止执行。
  只有在共享池中不存在等价SQL语句的情况下,才对SQL语句作语法分析。在这种情况下,数据库内核重新为该语句分配新的共享SQL区,并对语句进行语法分析。进行语法分析需要耗费较多的资源,所以要尽量避免进行语法分析,这是优化的技巧之一。
  语法分析阶段包含了不管此语句将执行多少次,而只需分析一次的处理要求。Oracle只对每个SQL语句翻译一次,在以后再次执行该语句时,只要该语句还在共享SQL区中,就可以避免对该语句重新进行语法分析,也就是此时可以直接使用其对应的执行计划对数据进行存取。这主要是通过绑定变量(bind variable)实现的,也就是我们常说的共享SQL,后面会给出共享SQL的概念。
  虽然语法分析验证了SQL语句的正确性,但语法分析只能识别在SQL语句执行之前所能发现的错误(如书写错误、权限不足等)。因此,有些错误通过语法分析是抓不到的。例如,在数据转换中的错误或在数据中的错(如企图在主键中插入重复的值)以及死锁等均是只有在语句执行阶段期间才能遇到和报告的错误或情况。
  oracle视频教程请关注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-581482-1-1.html 上篇帖子: oracle 聚簇因子对查询性能的影响 下篇帖子: Oracle SQL语句处理的过程(二)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表