简单描述Oracle编码SQL

数据库 Oracle
这里介绍你的Oracle编码SQL是可以使用共享SQL 了,但数据库的性能反而会下降。 我在实际应用中已经遇到这种情况。所以建议编写需要稳定运行程序的开发人员最好还是一开始就使用绑定变量的SQL。

Oracle有很多值得学习的地方,这里我们主要介绍Oracle编码SQL,包括介绍SQL语句等方面。为了不重复解析相同的SQL语句(因为解析操作比较费资源,会导致性能下降),在***次解析之后,Oracle将SQL语句及解析后得到的执行计划存放在内存中。这块位于系统全局区域SGA(system global area)的共享池(shared buffer pool)中的内存可以被所有的数据库用户共享。

#t#因此,当你执行一个SQL语句(有时被称为一个游标)时,如果该语句和之前的执行过的某一语句完全相同,并且之前执行的该语句与其执行计划仍然在内存中存在,则Oracle就不需要再进行分析,直接得到该语句的执行路径。

Oracle的这个功能大大地提高了 SQL的执行性能并大大节省了内存的使用。使用这个功能的关键是将执行过的语句尽可能放到内存中,所以这要求有大的共享池(通过设置shared buffer pool参数值)和尽可能的使用绑定变量的方法执行SQL语句。

当你向Oracle 提交一个SQL语句,Oracle会首先在共享内存中查找是否有相同的语句。这里需要注明的是,Oracle对两者采取的是一种严格匹配,要达成共享,SQL语句必须完全相同(包括空格,换行等)。

下面是判断SQL语句是否与共享内存中某一SQL相同的步骤:
1). 对所发出语句的文本串进行hashed。如果hash值与已在共享池中SQL语句的hash值相同。
2) 将所发出语句的文本串

  1. str_sql string;  
  2. int_empno int;  
  3. int_empno = 2000;  
  4. str_sql = ‘SELECT * FROM emp WHERE empno = ‘ + int_empno;  
  5. …………  
  6. int_empno = 1000;  
  7. str_sql = ‘SELECT * FROM emp WHERE empno = ‘ + int_empno; 

上面的代码实际上使用了Oracle编码SQL,使我们不能使用共享SQL的功能,结果是数据库效率不高。但是从上面的2个语句来看,产生的Oracle编码SQL 只是列值不同,其它部分都是相同的,如果仅仅因为列值不同而导致这2个语句不能共享是很可惜的,为了解决这个问题,引入了CURSOR_SHARING参数,使这类问题也可以使用共享SQL,从而使这样的开发也可以利用共享SQL功能。

听起来不错,Oracle真为用户着想,使用户在不改变代码的情况下还可以利用共享SQL的功能。真的如此吗?天上不会无缘无故的掉一个馅饼的,Oracle对该参数的使用做了说明,建议在经过实际测试后再改该参数的值(缺省情况下,该参数的值为EXACT,语句完全一致才使用共享SQL)。

因为有可能该变该值后,你的Oracle编码SQL是可以使用共享SQL 了,但数据库的性能反而会下降。 我在实际应用中已经遇到这种情况。所以建议编写需要稳定运行程序的开发人员***还是一开始就使用绑定变量的SQL。

责任编辑:佚名 来源: IT168
相关推荐

2009-11-19 10:43:54

Oracle Clob

2009-11-17 16:47:09

Oracle物化视图日

2010-04-15 16:16:33

Oracle SQL

2010-07-14 15:32:28

SQL Server

2010-04-12 17:30:44

Oracle SQL调

2010-04-09 10:32:03

Oracle 数据库

2010-04-09 10:43:34

Oracle SQL

2009-11-17 13:45:12

Oracle SQL调

2010-08-04 15:59:29

2009-09-09 15:28:43

Linq to obj

2009-09-18 16:00:07

LINQ架构

2009-09-14 10:57:46

LINQ入门

2009-09-15 16:26:36

Linq orderb

2009-09-22 12:45:00

Hibernate性能

2009-09-28 15:43:42

Hibernate O

2009-09-23 10:58:32

Hibernate T

2009-09-22 11:16:27

Hibernate经验

2009-09-27 13:00:56

Hibernate S

2009-11-20 14:48:07

2009-06-24 16:42:17

JSF和Facelet
点赞
收藏

51CTO技术栈公众号