官方文档 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
分享到:
相关推荐
本项目提供了一个Java源码工具,能够帮助用户便捷地将Oracle SQL语句转换为MySQL SQL语句。 Oracle SQL与MySQL SQL的主要差异在于以下几个方面: 1. **数据类型**:Oracle支持的数据类型如NUMBER、LONG、RAW等在...
SQL语句执行过程是一个涉及到客户端与服务器端交互、多个阶段的复杂过程,包含了对SQL语句的处理、解析、优化以及最终的执行。这个过程对于数据库管理员来说,需要对数据库内部结构有深入的了解,才能够完全掌握。 ...
在Java编程中,调试SQL语句是开发过程中的常见任务,尤其当面对复杂且冗长的查询时。为了提高效率并使SQL语句更易于理解和分析,格式化SQL语句显得尤为重要。标题提及的"Java打印漂亮的SQL语句(被格式化的SQL语句)...
通过以上两个示例可以看出,在Oracle存储过程中实现动态SQL语句的关键在于利用`EXECUTE IMMEDIATE`动态执行SQL语句以及通过创建包的方式来实现更为复杂的动态数据处理逻辑。这两种方法不仅提高了代码的灵活性,还...
【标题】"SQL语句处理为C#/VBNet下的代码格式"主要涉及到的是将SQL查询语句转换成C#或VB.NET代码的过程。这通常在开发.NET应用时,特别是需要在应用程序中执行动态SQL或者存储过程时发生。下面将详细阐述这个过程中...
SqlCommand对象允许我们发送SQL查询、存储过程或其他Transact-SQL语句到数据库。例如: ```csharp SqlCommand cmd = new SqlCommand(sqlCommandText, conn); int result = cmd.ExecuteNonQuery(); // 对于非查询...
### Delphi ADOQuery 处理多条 SQL 语句 在 Delphi 开发环境中,ADOQuery 是一种常用的数据库查询组件,它支持多种数据库操作,包括执行 SQL 语句、查询数据等。本文将详细解释如何使用 Delphi 的 ADOQuery 组件来...
本资源集合了泛微系统中与SQL Server数据库交互时常用的各种SQL语句,涵盖了组织架构、流程管理以及自定义需求等多个方面。以下是对这些SQL语句知识点的详细解释: 1. **组织架构相关SQL**: - 组织架构是企业信息...
SQL Server 中存储过程比直接运行 SQL 语句慢的原因 在 SQL Server 中,存储过程比直接运行 SQL 语句慢的原因是 Parameter sniffing 问题。Parameter sniffing 是指 SQL Server 在执行存储过程时,使用参数的统计...
Dapper支持动态SQL和参数化查询,可以在C#代码中拼接SQL语句,并自动处理参数绑定,减少了SQL注入的风险。 三、手工构建SQL字符串 如果你不希望使用ORM,也可以手工构建SQL字符串。C#的string类提供了丰富的字符串...
以上整个流程涵盖了SQL语句从客户端提交到服务器端处理,再到执行以及优化的全过程。了解这个流程对于数据库管理员和开发人员来说是非常重要的,因为它直接影响到数据库操作的效率和数据访问的速度。通过熟悉这些...
- `SqlStr`:需要被处理的原始SQL语句。 - `keyWordSql`:标识SQL语句中的关键字(例如INSERT或UPDATE),用于确保每个分割后的SQL语句的完整性。 - `SqlMaxLen`:表示单个SQL语句的最大长度,如果原始SQL语句超过了...
标题中的“基本SQL语句及PL/SQL语句”涵盖了关系数据库管理中两个重要的概念:SQL(Structured Query Language)和PL/SQL(Procedural Language/SQL)。SQL是用于管理和处理关系数据库的标准语言,而PL/SQL是Oracle...
在数据库管理与开发过程中,编写SQL语句是必不可少的一环。有时,我们可能会遇到需要执行非常长的SQL语句的情况。这些超长语句可能由于包含大量的条件、子查询或是数据量较大等原因而变得异常复杂。本文将围绕“SQL...
C#具有丰富的类库和强大的.NET框架支持,可以与数据库进行交互,但编写SQL语句的过程相对繁琐,尤其是在处理大量数据操作时。 "SQL语句辅助工具"通过自动化这个过程,大大提升了开发效率。它能够解析SQL语句,并...
2. **公文档案**:在公文处理过程中,SQL语句可以用于查询、存储和更新文档状态。例如,"批复意见回填表单.doc"和"将处理人姓名与处理时间回填表单字段.doc"可能涉及到对审批流程记录的管理,通过SQL语句更新这些...
- **存储过程**:预编译的SQL语句集合,可封装复杂的业务逻辑,提高效率和安全性。 - **触发器**:在特定数据库操作(如INSERT、UPDATE或DELETE)发生时自动执行的代码段。 9. **窗口函数** - **ROW_NUMBER()、...
名称:E10查用SQL语句集合 适用人群:ERP管理员 适用场景:E10ERP系统上线持续改善,SQL常用语句 功能描述:PO待交明细、出入库统计表、待领料清单、请购中品号无单价的品号清单、请购单中无品号采购信息的品号清单 ...
最优化的SQL语句能够在最小的资源消耗下,完成特定的数据库操作,并且保证响应速度和数据处理效率。 2. MySQL数据库简介:MySQL是一个开放源代码的关系型数据库管理系统,广泛应用于Web应用中。它使用结构化查询...
1. **SQL语句解析**:SQL(Structured Query Language)是用于管理和处理关系型数据库的标准语言。解析SQL语句是指将人类可读的SQL命令转化为计算机可执行的指令。这一过程通常由数据库管理系统(DBMS)完成,但开发者...