ITPub博客

首页 > 数据库 > Oracle > 共享SQL语句

共享SQL语句

原创 Oracle 作者:luisedalian 时间:2014-01-14 09:32:58 0 删除 编辑

为了不重复解析完全相同的SQL语句,在第一次解析之后,Oracle将解析后的SQL语句存储在内存中。

SGA->Shared Pool->Library Cache->Shared SQL Area。

Oracle对Share SQL Area的共享要求两个SQL语句在文本上必须完成相同,包括空格、换行、大小写都必须完全相同。

点击(此处)折叠或打开

  1. --清空shared pool
  2. sys@TESTDB11>alter system flush shared_pool;

  3. --使用scott执行下面的语句
  4. scott@TESTDB11>select * from emp where empno = 7788;
  5. scott@TESTDB11>select * from emp where empno = 7788;
  6. scott@TESTDB11>SELECT * FROM EMP WHERE EMPNO = 7788;
  7. scott@TESTDB11>Select * From Emp Where Empno = 7788;
  8. scott@TESTDB11>select * from emp where empno = 7788;

  9. --查看在SCOTT方案中解析的SQL语句,结论:语句的文本必须完全相同才能被认为是相同的SQL语句
  10. sys@TESTDB11>select sql_id, child_number, sql_text from v$sql where parsing_schema_name = \'SCOTT\';

  11. SQL_ID CHILD_NUMBER SQL_TEXT
  12. ------------- ------------ ------------------------------------------------------------------------
  13. fnzhctjcmspgz 0 SELECT * FROM EMP WHERE EMPNO = 7788
  14. 073yn322p1cx9 0 select * from emp where empno = 7788
  15. 7mc5065rargfv 0 select * from emp where empno = 7788
  16. 7mh165n4umhsx 0 Select * From Emp Where Empno = 7788

两语句引用的对象必须完全相同。


点击(此处)折叠或打开

  1. --授权
  2. scott@TESTDB11>grant select on emp to hr;
  3. --在HR方案中创建表
  4. hr@TESTDB11>create table emp as select * from scott.emp;
  5. --清空shared pool
  6. sys@TESTDB11>alter system flush buffer_cache;

  7. --执行下面2条SQL语句
  8. scott@TESTDB11>select * from emp;
  9. hr@TESTDB11>select * from emp;

  10. --查看结果. 两个语句共享相同的父游标,但对应于不同的子游标
  11. sys@TESTDB11>select sql_id, hash_value, child_number, sql_text from v$sql
  12.              where parsing_schema_name = \'SCOTT\' or parsing_schema_name =\'HR\';

  13. SQL_ID HASH_VALUE CHILD_NUMBER SQL_TEXT
  14. ------------- ---------- ------------ ----------------------------------------------------------------------------------------------------
  15. gx6qnrgvv63mx 4155707005 0 SELECT /* OPT_DYN_SAMP */ /*+ ALL_ROWS IGNORE_WHERE_CLAUSE NO_PARALLEL(SAMPLESUB) opt_param(\'paralle
  16.                                       l_execution_enabled\', \'false\') NO_PARALLEL_INDEX(SAMPLESUB) NO_SQL_TUNE */ NVL(SUM(C1),:\"SYS_B_0\"),
  17.                                       NVL(SUM(C2),:\"SYS_B_1\") FROM (SELECT /*+ NO_PARALLEL(\"EMP\") FULL(\"EMP\") NO_PARALLEL_INDEX(\"EMP\") */
  18.                                       :\"SYS_B_2\" AS C1, :\"SYS_B_3\" AS C2 FROM \"HR\".\"EMP\" \"EMP\") SAMPLESUB

  19. a2dk8bdn0ujx7 1745700775 0 select * from emp
  20. a2dk8bdn0ujx7 1745700775 1 select * from emp

两个SQL语句必须使用相同的绑定变量名。(否则,即使是使用相同的绑定变量值,也不会共享SQL文本)


点击(此处)折叠或打开

  1. --清空shared pool
  2. sys@TESTDB11>alter system flush buffer_cache;

  3. --定义绑定变量并赋值
  4. scott@TESTDB11>variable empno1 number
  5. scott@TESTDB11>execute :empno1 := 7788;

  6. PL/SQL procedure successfully completed.

  7. scott@TESTDB11>variable empno2 number
  8. scott@TESTDB11>execute :empno2 := 7788;

  9. PL/SQL procedure successfully completed.

  10. --执行两条语句
  11. scott@TESTDB11>select e.empno, e.ename, e.job from emp e where empno = :empno1;


点击(此处)折叠或打开

  1. scott@TESTDB11>select e.empno, e.ename, e.job from emp e where empno = :empno2;


点击(此处)折叠或打开

  1. --查看结果. 是不同的光标
  2. sys@TESTDB11>select sql_id, hash_value, child_number, sql_text from v$sql where parsing_schema_name = \'SCOTT\';


点击(此处)折叠或打开

  1. --绑定变量赋予不同的值,但SQL语句在Shared SQL Area中是共享的
  2. scott@TESTDB11>execute :empno1 := 7369;
  3. scott@TESTDB11>select e.empno, e.ename, e.job from emp e where empno = :empno1;


点击(此处)折叠或打开

  1. sys@TESTDB11>select sql_id, hash_value, child_number, sql_text from v$sql where parsing_schema_name = \'SCOTT\';






来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/17013648/viewspace-1070261/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: 删除重复的记录
请登录后发表评论 登录
全部评论

注册时间:2012-02-06

  • 博文量
    1986
  • 访问量
    6040844