`
032615
  • 浏览: 59916 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

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、检查库缓存(SGA中的Shared Pool (共享区)中的library cache,Library cache包括共享的sql游标,sql原代码以及执行计划、存储过程和会话信息)中是否存在同样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

  • 大小: 35.3 KB
分享到:
评论

相关推荐

    SQL Server中存储过程比直接运行SQL语句慢的原因

    1. 存储过程只在创造时进行编译即可,以后每次执行存储过程都不需再重新编译,而我们通常使用的SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。 2. 经常会遇到复杂的业务逻辑和对数据库的...

    常用经典sql语句(sqlserver版)

    SQL Server 数据库管理常用的SQL和T-SQL语句 SQL SERVER 与ACCESS、EXCEL的数据转换 sql server中,日期比较、日期查询的常用语句 SQLSERVER 索引 填充因子 Server 中一个非常强大的日期格式化函数 根据表中数据...

    经典SQL语句大全

    10、说明:几个简单的基本的sql语句 选择:select * from table1 where 范围 插入:insert into table1(field1,field2) values(value1,value2) 删除:delete from table1 where 范围 更新:update table1 set field1...

    如何编写高效SQL语句

    性能调整综述 有效的应用设计 SQL语句处理的过程 编写高效SQL语句

    学生成绩管理系统Oracle全部SQL语句.txt

    (1)选定某一主题,创建一个oracle数据库,对其进行日常管理及应用(全部用SQL语句实现): 1、创建数据库实例,数据库表空间,创建管理员,普通用户,并分别授予相应权限; 2、至少建立5个表,以及表间关系,使用...

    ORACLE数据库SQL语句的执行过程

    SQL语句在数据库中处理过程是怎样的呢?执行顺序呢?在回答这个问题前,我们先来回顾一下:在ORACLE数据库架构下,SQL语句由用户进程产生,然后传到相对应的服务端进程,之后由服务器进程执行该SQL语句,如果是...

    动态sql语句动态处理输出列数

    可以自动处理查询语句中的列数 --1.打开游标 l_cursor := dbms_sql.open_cursor; --2.解析游标 dbms_sql.parse(l_cursor,'select bus_type as 流程名称,st_center as 结算中心,st_department as 编制部门,bus_desc ...

    Sql语句脚本开发详细实例

    全部用Sql语句进行建库,建表,创建表内约束和表间关系,以及创建存储过程、触发器和视图,并且带有详细的说明,以及SQL事务处理的实例

    嵌入式SQL(E-SQL)简介

    2.2 嵌入SQL的处理过程 6 2.3 嵌入SQL语句总览 7 2.3.1 宿主变量 7 2.3.2 连接数据库 12 2.3.3 数据的查询和修改 13 2.3.4 游标的使用 14 2.3.5 SQLCA 15 2.3.6 WHENEVER 17 2.3.7 批处理 18 2.3.8 事务 18 2.4动态...

    C#数据处理的类(oracle数据库),可处理存储过程、函数、SQL语句

    自己写的C#数据处理的类,拿出来分享一下。可以处理存储过程、函数、SQL语句,方便的添加参数方式。 有兴趣的朋友共同研究一下。

    浅谈从SQL语句执行过程优化ORACLE数据库.pdf

    浅谈从SQL语句执行过程优化ORACLE数据库.pdf

    EF Core执行原生SQL语句的一个扩展方法

    这是一个EF Core的扩展方法,可以执行任意的复杂SQL语句、存储过程。 在EFCore下执行原生SQL查询语句的方法——FromSqlRaw和FromSqlInterpolated,不能查找部分列,只能查找全部列,而且只能单表查询,不能使用join...

    SQL语句的基本用法案例.pdf

    “SQL语句的基本用法案例”的文档,是一份非常实用的学习资料,为初学者和进阶者提供了丰富的SQL操作示例。通过这份文档,读者可以系统地了解SQL语言在数据库管理中的应用,掌握从创建数据库到删除数据库的整个流程...

    ORACLE优化SQL语句,提高效率

    我们要做到不但会写SQL,还要做到写出性能优良的SQL语句。  (1)选择最有效率的表名顺序(只在基于规则的优化器中有效):  Oracle的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表...

    修改SQL数据库排序规则修改表栏位排序规则

    修改SQL数据库排序规则修改表栏位排序规则 修改SQL数据库排序规则: 1.修改为单用户模式 2.然后关闭所有的查询窗口,修改Options的Collocation属性,如:...7-执行对应的sql语句及导出 或 不执行对应的sql语句只导出

    数据库嵌入式SQL介绍与应用

    2.2 嵌入SQL的处理过程 6 2.3 嵌入SQL语句总览 7 2.3.1 宿主变量 7 2.3.2 连接数据库 12 2.3.3 数据的查询和修改 13 2.3.4 游标的使用 13 2.3.5 SQLCA 15 2.3.6 WHENEVER 16 2.3.7 批处理 18 2.3.8 事务 18 2.4动态...

    sql 中循环处理表记录

    sql 循环表中记录 这个写的是个函数,以便存储过程中调用!

    基于Java的Pndao框架:自动化MyBatis SQL语句生成工具源码

    Pndao是一个轻量级的MyBatis SQL自动化生成工具,旨在通过遵循DAO的命名约定来简化SQL语句的生成与维护过程。该项目完全采用Java语言开发,为开发者提供了一个高效的数据库操作解决方案。 技术构成: - 主要编程...

    通过分析SQL语句的执行计划优化SQL(总结)

    第3章 SQL语句处理的过程 第4章 ORACLE的优化器 第5章 ORACLE的执行计划 访问路径(方法) -- access path 表之间的连接 如何产生执行计划 如何分析执行计划 如何干预执行计划 - - 使用hints提示 具体案例分析 ...

    LECCO SQL Expert (智能自动SQL优化)

     5、先进的SQL语法分析器能处理最复杂的SQL语句; 6、可重写SELECT、SELECTIN-TO、UPDATE、INSERT和DELETE语句; 7、通过测试运行,为应用程序和数据库自动找到性能最好的SQL语句; 8、提供微秒级的计时; 9、...

Global site tag (gtag.js) - Google Analytics