转载地址:http://cjjwzs.iteye.com/blog/1010263
Oracle在执行SQL语句时,普遍存在以下几个步骤:
当SQL语句首次执行,Oracle将确认该句语句的语法是否正确(语法解析Syntax parse)并进一步确认语句相关表和列的存在性等因素(语义解析semantic parse)以及优化器决定执行计划等步骤。整个过程称之为硬解析,硬解析消耗大量的CPU时间和系统资源。硬解析过多会有效降低系统性能。
若之前已进行过硬解析,且解析后的分析树和执行计划仍存在于共享池中,则同样的SQL仅需要软解析。软解析将输入的SQL语句转换为哈希代码,同共享池内哈希链表上的已有记录进行对比,找出对应的游标信息,使用已有的执行计划执行。
绑定变量,将实际的变量值代入SQL语句中。
执行SQL语句,查询语句将返回结果集。
不使用绑定变量的SQL语句,Oracle无法将它们视为相同的,如以下两句语句:
select * from emp where empno=1234
select * from emp where empno=5678
因为自由变量的不同,Oracle认为以上是2句不同的语句,则当第一条被硬解析后,第二条SQL执行时仍无法避免硬解析。实际在以上不使用绑定变 量的情况中,只要自由变量有所改变则需要一次硬解析。这是强烈建议使用绑定变量的主要原因,使用绑定变量的语句变量的实际值仅在SQL执行的最后阶段被代 入。如以下语句:
select * from emp where empno=:x
该语句使用绑定值:x替代自由变量,在应用中语句可能以预编译或普通编译的方式存在,仅在执行阶段代入变量值,多次执行仅需要一次硬解析,较不使用绑定变量情况性能大大提升。
同时过多的硬解析还会引发共享池碎片过多的问题。因为每当需要硬解析一个SQL或者PLSQL语句时,都需要从shared pool中分配一块连续的空闲空间来存放解析结果。Oracle首先扫描shared pool查找空闲内存,如果没有发现大小正好合适的空闲chunk,就查找更大的chunk,如果找到比请求的大小更大的空闲chunk,则将它分裂,多 余部分继续放到空闲列表中。因为过多的硬解析加剧了内存段分配的需求,这样就产生了碎片问题。系统经过长时间运行后,就会产生大量小的内存碎片。当请求分 配一个较大的内存块时,尽管shared pool总空闲空间还很大,但是没有一个单独的连续空闲块能满足需要。这时,就可能产生 ORA-4031错误。
通常我们可以通过以下SQL语句将系统中非绑定变量的语句找出:
SELECT substr(sql_text,1,40) “SQL”,
count(*) ,
sum(executions) “TotExecs”
FROM v$sqlarea
WHERE executions < 5 –-语句执行次数
GROUP BY substr(sql_text,1,40)
HAVING count(*) > 30 –-所有未共享的语句的总的执行次数
ORDER BY 2;
以上语句在实际使用中substr函数截取到的字符串长度需要视乎实际情况予以变化。
对于非绑定变量且短期内无法修改的应用,Oracle存在参数cursor_sharing可以改善其表现。cursor_sharing默认为 exact,对使用自由变量的语句不做额外处理;当设为force时,非绑定变量的SQL语句被进一步处理以达到共享SQL的目的,但以上处理步骤同样要 消耗一定的CPU时间;当设为similar时,若数据库存在语句相关统计信息则其表现如exact,若无统计信息则表现为force。 cursor_sharing参数是Oracle针对无法修改的非绑定变量应用所提出的折中方案,但cursor_sharing为force值时存在一 定SQL引发bug或语句无效的情况,且额外的处理操作同样需要消耗一定量的CPU时间和系统资源。故针对系统性能的最优方案往往是直接修改应用代码,使 用绑定变量特性。
分享到:
相关推荐
为了解决这些问题,我们可以使用预编译的PreparedStatement对象来绑定变量,例如: ```java String sql = "select name from oms_user where id=?"; PreparedStatement pstmt = connection.prepareStatement(sql); ...
Oracle数据库的绑定变量特性及其应用是数据库管理中的一个重要概念,特别是在处理大量数据和优化SQL查询性能时。绑定变量,也称为参数化查询或占位符,是SQL语句中用特殊符号(如“:var”)代替具体值的方式,使得同...
如果不使用绑定变量,每次查询都是一个新的查询,这将导致 Oracle 需要分析、解析、安全检查、优化等一系列操作。这些操作将消耗大量的系统资源,降低用户的使用数量,并且会把优化好的其它查询语句从共享池中踢出。...
- **减少内存消耗**:绑定变量有助于减少共享池中的解析对象,避免了由于硬编码查询导致的“软解析”频繁,从而节省了内存资源,提高了系统的整体性能。 - **提高可伸缩性**:对于大量并发用户执行类似查询的场景...
Oracle 绑定变量窥视功能深度分析 Oracle 绑定变量窥视功能是 Oracle 数据库中的一种功能,可以使 SQL 语句共享执行计划,从而提高数据库性能。该功能通过在绑定变量中存储执行计划,从而避免了每次执行 SQL 语句...
### Java中Oracle操作绑定变量使用用户工具模块解决方案 #### 一、背景介绍 在Java开发过程中,特别是与Oracle数据库交互的应用场景中,SQL语句的编写及执行效率一直是开发者关注的重点之一。为了提高SQL语句的...
【Oracle的绑定变量】在数据库管理系统中,尤其是Oracle OLTP(在线事务处理)系统中,绑定变量是一个关键的性能优化技术。它对于提高系统效率、减少资源消耗具有显著作用。绑定变量的基本思想是通过变量来替代SQL...
在硬编码查询中,每更换一个员工编号,Oracle都需要重新处理,而绑定变量查询则只需编译一次,后续只需要改变变量值即可,这大大提升了效率,尤其在频繁执行相同结构但不同参数的查询时。 接下来,我们通过一个示例...
不使用绑定变量,例如在Java程序中直接将变量值拼接到SQL语句中,会导致每次SQL语句的值改变时,Oracle都需要重新解析SQL,这称为硬分析(Hard Parse)。硬分析不仅消耗CPU资源,还会增加数据库的负载,因为每次都...
结果显示,使用绑定变量的SQL语句只经历了两次硬解析,而其他未使用绑定变量的SQL语句则各自经历了一次硬解析。 #### 使用`define`命令定义变量 除了直接在SQL语句中使用绑定变量外,还可以使用`define`命令定义...
Oracle数据库的绑定变量是一种优化策略,它在提升数据库性能、可扩展性和稳定性方面扮演着重要角色。绑定变量的使用能够显著改善SQL语句的执行效率,尤其是在处理大量重复查询时。本文将深入探讨绑定变量的原理、...
由于我们使用了绑定变量,所以Oracle只需要软分析一次,而不需要每次都进行硬分析,从而提高了数据库的性能。 需要注意的是,绑定变量可以在PL/SQL过程中使用,例如: Declare i number; Begin i := 1; Select ...
举个例子,假设你要查询不同员工的编号,用硬编码的方式(如`SELECT * FROM emp WHERE empno='123'`)每次都会创建新的执行计划,而使用绑定变量(如`SELECT * FROM emp WHERE empno=:eno`)则只需解析一次。...
使用绑定变量可以避免这种情况,因为它允许数据库引擎预先解析和编译SQL语句结构,只在运行时替换参数值,从而显著减少了解析和执行的时间,提高了应用程序的性能。 ### 绑定变量的应用场景 1. **动态SQL语句构建*...
在处理大量动态查询时,使用绑定变量可以显著减少Oracle的解析次数,减轻SGA的压力,进而提升系统的整体性能。 绑定变量的工作原理是:在PHP代码中,我们不直接将变量值插入到SQL语句中,而是声明一个占位符(如`:...
首先,不使用绑定变量会导致SQL语句的硬分析(Hard Parse)过于频繁。当Oracle遇到一个SQL语句时,它会检查其在Shared Pool(内存区域)中是否存在相同的语句。如果不存在,就会进行硬分析,检查涉及的对象的有效性...
总的来说,绑定变量是提高Oracle数据库性能的关键技术之一,尤其在处理大量动态或重复执行的SQL语句时,能显著减少解析开销,提升系统整体性能。因此,理解和熟练掌握绑定变量的使用对于任何Oracle数据库开发者来说...
可以通过预编译、绑定变量、使用索引、合理规划数据访问路径等方式来降低硬解析的频率。同时,监控数据库的硬解析计数(`V$SYSSTAT`视图中的`parse count (hard)`)可以帮助识别性能瓶颈,以便针对性地进行优化。 ...