Oracle SQL语句解析过程你造么?

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介:

我们都知道,Oracle在执行SQL之前,需要对SQL语句进行解析。Oracle中,SQL语句可分为DDL和DML两类。对于DDL,因为很少被共享使用,故几乎每次执行时,都需要进行硬解析。而对于DML,会根据实际情况进行硬解析或软解析。这些过程都是如何进行的,什么是硬解析,什么又是软解析呢?我们将在下文揭晓。


SQL语句的解析过程,从总体上,可分为四个阶段:


  • 语法检查

  • 语意检查

  • 解析阶段

  • 执行阶段


针对每个阶段,我们可以做个详细的划分:



1
语法检查



对SQL语句进行语法检查,检查是否有语法错误,比如from有没有写错,如果写错,则退出解析过程。



2
 语意检查



这里主要是检查对象和权限,可分为以下三步:


1、 到数据字典里校验SQL语句中涉及的对象和列是否都存在,如果不存在,则退出解析过程。


2、 将对象进行名称转换。比如将同义词转换成实际的对象,如果转换失败,则退出解析过程。


3、 检查用户是否具有访问转换后的对象的权限。如果没有权限,则退出解析过程。



3
 解析阶段
 



这一阶段主要是对SQL执行的环境进行判断,如绑定变量是否一样,语言环境是否一样等。可分为以下五步:


1、 对SQL文本进行HASH运算,并定位对象的句柄


这里是区分大小写、空格、注释等,定位到相同的HASH桶和HASH桶内的LIBRARY CACHE 对象句柄。


2、 检查对象的相关性


主要检查SQL对象与LIBRARY CACHE的同名对象是不是属于相同的OWNER。


3、 检查绑定变量是否一样


主要检查以下内容:


  • 绑定名是否一样,如应用代码生成的绑定1、:SYS_B_0,与SQLPLUS生成的绑定变量:b1是不一样的。


  • 绑定数据类型和绑定变量长度是否一样,如绑定的数据类型(char、number)不一致,字符串绑定变量的长度是否一样,如绑定值1和33可能是不同的子游标。


4、 检查语言环境、排序环境是否一样


例如,在会话级重新设置过语言环境,那么SQL是不能共享的。


5、 创建执行计划


根据RBO或CBO,生成一个最优的执行计划,这也是最消耗CPU的一步。



4
执行阶段
 



通过前三个阶段一系列的检查通过后,SQL语句将进入执行阶段,这里可分为三步:


1、 将该游标所产生的执行计划、SQL文本等装载进library cache的若干个heap中。


2、 通过私有CURSOR来执行SQL。


3、 如果是SELECT,则需要UGA来FETCH数据。


以上就是SQL解析的全过程,当前三个阶段全部要执行的时候,就是硬解析,发生在SQL第一次执行的时候。前三个阶段,省略了其中的一步,就是软解析,发生在SQL第二次执行的时候。当SQL第三次执行的时候,会把SQL的共享CURSOR复制到私有CURSOR中,由session_cached_cursors决定UGA中私有游标的数量。当SQL第四次执行的时候,会直接访问私有CURSOR,直接从第四阶段的第二步开始执行,这就是所谓的软解析。


下面再提供一个语句,以查询SQL不能被共享的原因:



在这些原因中,简单列出常见的原因:


  • SQL_TYPE_MISMATCH:类型不匹配

  • AUTH_CHECK_MISMATCH:语句授权不匹配

  • LANGUAGE_MISMATCH:语言环境不匹配

  • USER_BIND_PEEK_MISMATCH:在cursor_sharing= SIMILAR模式下 where id > 1 和 where id > 2会生成2个cursor

  • UNBOUND_CURSOR:没有绑定


SQL的解析是比较消耗CPU的。了解它的全过程,可以让数据库管理员在分析问题的时候有比较清淅的思路,对分析SQL问题、shared_pool问题都有非常大的帮助。


作者介绍:温伟灵


  • 新炬网络高级技术专家。六年的IT运维经验。

  • 具有30TB级的OLTP数据库运维经验,擅长故障诊断、处理。

  • 精通ORACLE数据库的内存结构、RAC、DataGuard等,在备份恢复、GoldenGate方面有深入的钻研。

  • 目前负责十多个客户的数据库运维工作,具有交通、金融、政府、移动、医疗等行业的运维经验。


本文来自云栖社区合作伙伴"DBAplus",原文发布时间:2016-02-17

目录
相关文章
|
19天前
|
SQL Oracle 关系型数据库
解决大小写、保留字与特殊字符问题!Oracle双引号在SQL中的特殊应用
在Oracle数据库开发中,双引号的使用是一个重要但易被忽视的细节。本文全面解析了双引号在SQL中的特殊应用场景,包括解决标识符与保留字冲突、强制保留大小写、支持特殊字符和数字开头标识符等。同时提供了最佳实践建议,帮助开发者规避常见错误,提高代码可维护性和效率。
80 6
|
24天前
|
SQL Oracle 关系型数据库
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
|
1月前
|
SQL Oracle 关系型数据库
【YashanDB知识库】yashandb执行包含带oracle dblink表的sql时性能差
【YashanDB知识库】yashandb执行包含带oracle dblink表的sql时性能差
|
26天前
|
SQL Oracle 关系型数据库
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
本文来自YashanDB官网,介绍如何处理Oracle客户端sql*plus中使用@@调用同级目录SQL脚本的场景。崖山数据库23.2.x.100已支持@@用法,但旧版本可通过Python脚本批量重写SQL文件,将@@替换为绝对路径。文章通过Oracle示例展示了具体用法,并提供Python脚本实现自动化处理,最后调整批处理脚本以适配YashanDB运行环境。
|
3月前
|
SQL Oracle 关系型数据库
如何在 Oracle 中配置和使用 SQL Profiles 来优化查询性能?
在 Oracle 数据库中,SQL Profiles 是优化查询性能的工具,通过提供额外统计信息帮助生成更有效的执行计划。配置和使用步骤包括:1. 启用自动 SQL 调优;2. 手动创建 SQL Profile,涉及收集、执行调优任务、查看报告及应用建议;3. 验证效果;4. 使用 `DBA_SQL_PROFILES` 视图管理 Profile。
|
3月前
|
SQL Java 数据库连接
如何在 Java 代码中使用 JSqlParser 解析复杂的 SQL 语句?
大家好,我是 V 哥。JSqlParser 是一个用于解析 SQL 语句的 Java 库,可将 SQL 解析为 Java 对象树,支持多种 SQL 类型(如 `SELECT`、`INSERT` 等)。它适用于 SQL 分析、修改、生成和验证等场景。通过 Maven 或 Gradle 安装后,可以方便地在 Java 代码中使用。
812 11
|
5月前
|
SQL Java 数据库连接
canal-starter 监听解析 storeValue 不一样,同样的sql 一个在mybatis执行 一个在数据库操作,导致解析不出正确对象
canal-starter 监听解析 storeValue 不一样,同样的sql 一个在mybatis执行 一个在数据库操作,导致解析不出正确对象
|
1月前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
148 29
|
1月前
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
54 3
|
1月前
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

热门文章

最新文章

推荐镜像

更多