`

Oracle的SQL解析

阅读更多

原文:http://hi.baidu.com/easydba/blog/item/c637896037410ada8db10d91.html

 

 

Oracle发布一个SQL语句的处理过程:

1、将该语句转化成ASCII等效数字码;
2、将ASCII等效数字码传递给一个散列算法,由该散列算法产生一个单独的散列;
3、搜索当前用户的session缓存中(在PGA中)是否存在相同的散列版本,如果存在,就直接执行该语句。这就是fast parse。
4、如果在PGA中没有命中,查找其他的session中是否有相同的散列,这就需要到共享池的库缓存中对查找。如果在库缓存中找到相同的散列。这就是soft parse。
5、若在3和4中都没有找到相同散列,用户进程进行语法检查过程(Syntax Check)。语法检查主要时检查语法是否符合SQL Reference Manual中给出的SQL语法。
6、语法检查通过之后,再进行语义分析过程(Semantic Analysis)。这个过程就是检查对象的合法性。检查表是否存在,列是否存在,是否有权限访问等等。
7、选择执行计划。准备从可用的执行计划中选择一个执行计划,其中包括存储大纲(srored outline)或物化视图(materialized view)相关的决定。
8、生成该语句的一个编译代码(p-code)。这完整的整个步骤就是hard parse。

example:

SQL>select * from test ;   --hard parse
SQL>select * from TEST ;   --hard parse
SQL>select * from test ;   --soft parse
SQL>alter session set session_cached_cursors=100;
SQL>select * from test ;   --soft parse
SQL>select * from test ;   --fast parse

这是我理解的oracle对SQL语句的处理的一个步骤,但是在网上可以看到很多对这个的解释的步骤跟我这里理解的不一样。但是我也没有找到官方的或者比较权威的资料来阐述这个步骤的,希望哪位达达来指点一下。

官方文档 Note:32895.1 解释:

 


NOTES
=====

1. A cursor is an address on the client that points to the memory location of a SQL statement on the server. Multiple-client cursors may point at the same address on the server.

2. Remember that 'Client' and 'Server' sides may reside on the same machine - in which case Client/Server is a logical distinction.

3. If a cursor is open, then the statement will be in the sql_area, so no parsing is necessary. This is why locks may remain when a client is terminated abnormally (such as a PC Client being turned off without
closing open cursors).

4. SESSION_CACHED_CURSORS is the initialisation parameter that specifies how many cursors to hold open for a particular session.

5. HOLD_CURSOR is an precompiler parameter that specifies that an individual cursor should be held open. See Page 11-3 of the Programmer's guide to the Oracle Precompilers.

6. Both the soft and hard parse register as a parse in tkprof. Hashing the current statement updates the parse count.

7. Soft parse avoids many of the steps taken during the parse phase for a particular statement. Initial syntactic and semantic checks are made and then the statement is hashed and compared with hashed statements in the SQL area. If a match is found, then existing information is used and relatively expensive steps (such as query optimization etc.) are avoided.

8. The 10053 event is only invoked during a hard parse.

SQL语句的处理过程修正:

对照metalink给出的这个示意图,我们可以对SQL的处理过程作如下的描述:
1、检查是否有打开的游标,如果有,则直接通过游标link到位于PGA的private SQL AREA( private SQL area),转步骤11。否则,执行步骤2。
2、检查初始化参数SESSION_CACHED_CURSORS是否被设置,如果被设置,则同样可以通过游标指向到位于PGA的私有SQL AREA,转步骤11。否则执行步骤3。
3、检查HOLD_CURSOR以及RELEASE_CURSOR的设置。如果RELEASE_CURSOR=no(默认 no),HOLD_CURSOR=yes(默认为no),当ORACLE执行完SQL语句,为private SQL AREA分配的内存空间被保留,cursor和private SQL AREA之间的link也被保留,预编译程序不再使用它,同样可以通过这个指针直接在private SQL AREA获得语句,转步骤11。
这上面的三种情况,实际上都没有作任何parse,都是直接从位于PGA中的private SQL AREA获得语句并直接执行。此为fast parse。
这三种情况都不存在的情况下,oracle转到步骤4执行。
4、创建一个游标。
5、语法检查Syntax Check:检查语法书写是否正确,是否符合SQL Reference Manual中给出的SQL语法。
6、语义分析Semantic Analysis:查找数据字典,检查表、列是否正确,在所要求的对象上获取语法分析锁,使得在语句的语法分析过程中不改变这些对象的定义, 验证为存取所涉及的模式对象所需的权限是否满足。
7、将语句转化成ASCII等效数字码,再通过散列算法得到散列值。
8、检查库缓存中是否存在同样hash值的语句。如果存在,转步骤11。否则,执行步骤9。 这就是soft parse。
9、选择执行计划。从可用的执行计划中选择一个最优的执行计划,其中包括存储大纲(srored outline)或物化视图(materialized view)相关的决定。
10、生成该语句的一个编译代码(p-code)。
11、执行语句。

cursor:from Oracle9i Database Concepts:A cursor is a handle or name for a private SQL area--an area in memory in which a parsed statement and other information for processing the statement are kept.

当某个session执行一条语句之后,该语句的parse结果会在library cache中保存,同时也会在PGA的private sql area有一个拷贝的副本。cursor 总是通过一个link是直接链到 private sql area的。如果在private中没有找到这个副本,就需要对SQL进行parse,然后再在library cache中进行hash值的匹配。所以总的来说,使用cursor能不需要任何parse,就是因为直接从当前的private sql area中得到了语句相关信息,包括执行计划。而一旦需要到library cache中进行匹配,就必须需要parse。soft parse不是不作parse,只是parse的量比较小,只需要作语法检查和语义分析,以及散列语句。

关于预编译的两个参数说明:

HOLD_CURSOR:HOLD_CURSOR默认值为no,当oracle执行完sql语句,close游标之后,预编译程序将游标和缓存SQL的 cache链接标记为可重 用。并且释放已经分配给该语句的私有SQL AREA内存区域,解除parse locks。当有下一个语句需要使用时,这个链接立即被重用。当HOLD_CURSOR=YES时,当oracle执行完sql语句,为private SQL AREA分配的内存空间被保留,cursor和private SQL AREA之间的link也被保留,预编译程序不再使用它。

RELEASE_CURSOR:RELEASE_CURSOR的优先级高于HOLD_CURSOR。RELEASE_CURSOR默认值为no。 RELEASE_CURSOR=yes,当oracle执行完sql语句,close游标之后,缓存被释放,锁被解除,链接被标识为可重用。RELEASE_CURSOR=no,则主要有 HOLD_CURSOR来决定了。

另外说明一点,这两个参数是在预编译的文件中定义的。

这部分内容详细见:oracle documents -> Programmer's Guide to the Oracle Precompilers -> Performance Tuning ->   Optimizing SQL Statements   -> Using the Cursor Management Options

分享到:
评论

相关推荐

    oracle SQL解析步骤小结

    Oracle SQL解析步骤是数据库处理SQL查询的关键环节,它确保了SQL语句的正确性、安全性以及高效执行。以下是对这些步骤的详细说明: 1. **SQL语法检查**:这是解析的第一步,Oracle数据库会检查输入的SQL语句是否...

    oracle SQL疑难解析 书中SQL

    Oracle SQL疑难解析是一本专为解决数据库操作中遇到的实际问题而编写的书籍,它涵盖了大量SQL查询、数据处理和性能优化的实用技巧。在"oracle-sql-recipes-master"这个压缩包中,很可能是包含了书中的示例代码和练习...

    ORACLE SQL疑难解析ORACLE SQL RRECIPES A PROBLEM PDF电子书下载 带书签目录 sample

    ORACLE SQL疑难解析 ORACLE SQL RRECIPES A PROBLEM PDF电子书下载 带书签目录 sample,这是书的前半部分样张,仅供大家预览,如有需要,请购买正版。

    oracle-查找硬解析问题SQL语句

    在数据库中硬解析是万恶之源,为大家提供一个查找并且定位oracle硬解析问题SQL语句脚本

    ORACLE SQL性能优化系列

    为了不重复解析相同的 SQL 语句,在第一次解析之后,ORACLE 将 SQL 语句存放在内存中。这块位于系统全局区域 SGA(system global area)的共享池(shared buffer pool)中的内存可以被所有的数据库用户共享。因此,...

    oracle解析XMLTYPE字段里面节点值,并用PL/SQL将查询结果导出为excel

    oracle解析XMLTYPE字段里面节点值,并用PL/SQL将查询结果导出为excel

    解析Excle数据到Oracle数据库

    - **书籍**:如《Oracle SQL Developer Data Modeler》等书籍,可以帮助深入理解使用SQL Developer进行数据管理的方法。 总之,将Excel数据导入Oracle数据库涉及多种方法,具体选择取决于项目需求、技术背景和个人...

    OracleSQL疑难解析

    资源名称:Oracle SQL疑难解析内容简介:《Oracle SQL疑难解析》总结了针对Oracle数据库编写SQL时经常碰到的各种问题,提供大量现成的解决方法,包括汇总和聚合数据、多表数据查询、生成和获取数据、通用查询模式、...

    Oracle sql 疑难解析

    想要学习Oracle 开发方向的童鞋 还是可以关注下这本书的。

    精通OracleSQL第2版.zip

    《精通Oracle SQL(第2版)》是一本深入解析Oracle数据库查询语言的专业书籍,由Oracle ACE和OakTable团队的专家共同撰写,集成了他们的丰富经验和专业知识。这本书旨在帮助读者掌握Oracle SQL的高级技巧,提升在...

    oracle sql_tuning

    1. **SQL执行计划**:SQL执行计划是Oracle解析器为每个SQL语句制定的执行策略,包括表的扫描方式(全表扫描或索引扫描)、连接顺序、排序操作等。理解执行计划有助于找出性能瓶颈并进行优化。 2. **绑定变量**:...

    Oracle SQL编写规范

    使用相同的SQL语句可以减少数据库的解析时间,因为数据库可以重用之前解析的SQL语句。这样可以提高执行效率和减少数据库的负载。 3. 选用合适的优化器 不同的优化器可以对SQL语句的执行效率产生不同的影响。选择...

    sql中循环控制 SQL中json字符串处理.txt

    sql中while循环控制,不需要获取数据到程序语言中处理。 SQL中直接进行json格式字符串处理,省掉数据库和程序直接的调用

    oracle sql语句执行流程解析

    在Oracle数据库中,SQL语句是用于进行数据操作、查询、管理等任务的重要工具。一条普通的SQL语句从应用端提交开始,到在数据库中执行完毕,涉及了一系列复杂的过程。理解这些过程,有助于提高数据操作的效率以及进行...

    oracle SQL优化技巧

    Oracle 在内部执行了许多工作:解析 SQL 语句、估算索引的利用率、绑定变量、读数据块等。减少访问数据库的次数可以提高性能。 5. 在 SQL*Plus、SQL*Forms 和 Pro*C 中重新设置 ARRAYSIZE 参数 可以增加每次数据库...

    精通Oracle_SQL(第2版)含源码

    《精通Oracle SQL(第2版)》是一本深入解析Oracle数据库管理系统中SQL语言的专业书籍,旨在帮助读者全面理解和掌握在Oracle环境下高效、精准地运用SQL进行数据查询、操作和管理的技能。书中不仅包含了基础的SQL语法...

    java的sql解析器jsqlparser

    Java的SQL解析器JSQLPaser是一个强大的开源库,专门设计用于处理SQL语句的解析工作。这个库允许开发者分析SQL语句的结构,提取出其中的关键元素,如列名、表名、别名以及查询条件,从而在Java应用程序中实现对SQL的...

    Linux下定时自动执行Oracle_SQL

    在IT领域,尤其是在数据库管理和系统自动化操作中,利用Linux下的Crontab实现Oracle SQL的定时自动执行是一项极为实用且高效的技术。本文将深入探讨如何在Linux环境下设置Crontab来定期执行Oracle SQL脚本,这一过程...

    ORACLE SQL PERFORMANCE TUNING AND OPTIMIZATION

    执行计划是Oracle解析SQL语句后确定的数据获取策略,它描述了数据如何从表和索引中被检索。通过分析执行计划,我们可以发现潜在的性能瓶颈,如全表扫描、过多的磁盘I/O或不恰当的索引使用。 索引是提升查询速度的...

Global site tag (gtag.js) - Google Analytics