Oracle硬解析的几个例子

为了验证SQL硬解析的场景,设置了下面六个测试用的例子:
1、没有绑定变量下的普通查询
2、测试绑定变量下的查询
3、测试绑定变量下sql有变化的查询
4、测试DML非绑定变量的解析
5、测试在过程中执行插入的时候非绑定变量的SQL解析
6、使用了绑定变量之后的,过程中的SQL解析情况

/**
测试例子1:
   没有绑定变量下的普通查询
**/
drop table foo purge;

CREATE TABLE foo AS 
SELECT LEVEL AS x,100000-LEVEL AS y FROM dual  CONNECT BY LEVEL<=100000;

ALTER SYSTEM FLUSH SHARED_POOL;

SELECT * FROM foo WHERE x = 100;
SELECT * FROM foo WHERE x =999;
SELECT * FROM foo WHERE x=10000;

SELECT T.SQL_TEXT, T.SQL_ID, T.EXECUTIONS, T.PARSE_CALLS
  FROM V$SQL T
 WHERE UPPER(T.SQL_TEXT) LIKE '%FOO%';


/**
测试例子2:
   测试绑定变量下的查询
**/
drop table foo purge;

CREATE TABLE foo AS 
SELECT LEVEL AS x,100000-LEVEL AS y FROM dual  CONNECT BY LEVEL<=100000;

ALTER SYSTEM FLUSH SHARED_POOL;

VARIABLE temp NUMBER;

exec :temp :=99;
SELECT * FROM foo WHERE X = :temp;

exec :temp :=100;
SELECT * FROM foo WHERE X = :temp;

exec :temp :=101;
SELECT * FROM foo WHERE X = :temp;

SELECT T.SQL_TEXT, T.SQL_ID, T.EXECUTIONS, T.PARSE_CALLS
  FROM V$SQL T
 WHERE UPPER(T.SQL_TEXT) LIKE '%FOO%';

/**




测试例子3:
   测试绑定变量下sql有变化的查询
**/

drop table foo purge;

CREATE TABLE foo AS 
SELECT LEVEL AS x,100000-LEVEL AS y FROM dual  CONNECT BY LEVEL<=100000;

ALTER SYSTEM FLUSH SHARED_POOL;

VARIABLE temp NUMBER;

exec :temp :=99;
SELECT * FROM foo WHERE X = :temp;

exec :temp :=100;
SELECT * FROM FOO WHERE X = :temp;

exec :temp :=101;
SELECT * FROM foo WHERE X = :temp;

SELECT T.SQL_TEXT, T.SQL_ID, T.EXECUTIONS, T.PARSE_CALLS
  FROM V$SQL T
 WHERE UPPER(T.SQL_TEXT) LIKE '%FOO%';



/**
测试例子4:
   测试DML非绑定变量的解析
**/
 
drop table foo purge;

CREATE TABLE foo AS 
SELECT LEVEL AS x,100000-LEVEL AS y FROM dual  CONNECT BY LEVEL<=100000;

ALTER SYSTEM FLUSH SHARED_POOL;

INSERT INTO FOO VALUES(100,200);
INSERT INTO FOO VALUES(101,201);
INSERT INTO FOO VALUES(103,203);

SELECT T.SQL_TEXT, T.SQL_ID, T.EXECUTIONS, T.PARSE_CALLS
  FROM V$SQL T
 WHERE UPPER(T.SQL_TEXT) LIKE '%FOO%';



/**
测试例子5:
   测试在过程中执行插入的时候的SQL解析
**/

drop table foo purge;

CREATE TABLE foo AS 
SELECT LEVEL AS x,100000-LEVEL AS y FROM dual  CONNECT BY LEVEL<=100000;

ALTER SYSTEM FLUSH SHARED_POOL;

BEGIN
  FOR I IN 1..3 LOOP
      IF I=1 THEN
      	INSERT INTO FOO VALUES(1,1); 
      ELSIF I=2 THEN 
        INSERT INTO FOO VALUES(2,2);
      ELSIF I=3 THEN
        INSERT INTO FOO VALUES(3,3);
      END IF;  
  END LOOP;
END;
/
SELECT T.SQL_TEXT, T.SQL_ID, T.EXECUTIONS, T.PARSE_CALLS
  FROM V$SQL T
 WHERE UPPER(T.SQL_TEXT) LIKE '%FOO%';




/**
测试例子6:
   使用了绑定变量之后的,过程中的SQL解析情况
**/

drop table foo purge;

CREATE TABLE foo AS 
SELECT LEVEL AS x,100000-LEVEL AS y FROM dual  CONNECT BY LEVEL<=100000;

ALTER SYSTEM FLUSH SHARED_POOL;

BEGIN
  FOR I IN 1..200 LOOP
    INSERT INTO FOO VALUES(I,100000-I);
  END LOOP;
END;
/
SELECT T.SQL_TEXT, T.SQL_ID, T.EXECUTIONS, T.PARSE_CALLS
  FROM V$SQL T
 WHERE UPPER(T.SQL_TEXT) LIKE '%FOO%';

作者 陈字文(热衷于PM\ORACLE\JAVA等,欢迎同行交流)EMAIL:ziwen#163.com 扣扣:4零9零2零1零零

通过上述六个情况的试验,我们最终可以得到如下结论:

Oracle进行软解析的SQL必须是完全相同的,所谓相同的SQL必须是大小写一致(测试例子3),甚至是不能多一个或者少一个空格,这个结论可以通过修改测试例子3增加一个空格得到,结果就得到了不同的SQL_ID。只有完全一致的SQL,才可以得到相应的HASH值,从而才可以进行软解析。对于在SQL池中,我们需要分析在SQL池中出现的只有参数部分不同的SQL,如果出现了很多次,我们就有必要对其进行相应的变量绑定,从而降低硬解析成本,提高性能。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值