欢迎投稿

今日深度:

Oracle 11g 的PL/SQL函数结果缓存,oracle11g

Oracle 11g 的PL/SQL函数结果缓存,oracle11g


    模仿Oracle性能诊断艺术中的例子做了两个试验,书上说如果不用RELIES_ON,则函数依赖的对象发生的变更操作就不会导致结果缓存的失效操作(result_cache RELIES_ON(test1,test2)),试验证明不对,函数f1()并没有使用RELIES_ON,但表上的变化影响到了函数。

C:\Documents and Settings\guogang>sqlplus gg_test/gg_test@10.10.15.25_gg

SQL*Plus: Release 10.2.0.1.0 - Production on 星期一 8月 4 19:46:44 2014
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
连接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE    11.2.0.1.0      Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production

SQL> drop table test1 purge;
SQL> drop table test2 purge;
SQL> create table test1 as select * from dba_objects;
SQL> create table test2 as select * from all_objects;
SQL> select count(*) from test1;
  COUNT(*)
----------
     74144
SQL> select count(*) from test2;
  COUNT(*)
----------
     73248


SQL> create or replace function f1
   return number
   is
     l_ret number;
   begin
     select count(*) into l_ret
      from test1,test2
    where test1.object_type = test2.object_type
    and test1.object_type in ('TABLE SUBPARTITION','VIEW','INDEX','TABLE');
     return l_ret;
   end;
   /
函数已创建。


SQL> set timing on
SQL> select f1() from dual;
      F1()
----------
  60681409

已用时间:  00: 00: 07.29

--禁用结果缓存

SQL> execute dbms_result_cache.Bypass(bypass_mode=>true,session=>true);
SQL> select f1() from dual;
      F1()
----------
  60681409

已用时间:  00: 00: 03.60

--启用结果缓存

SQL> execute dbms_result_cache.Bypass(bypass_mode=>false,session=>true);
SQL> select f1() from dual;
      F1()
----------
  60681409
已用时间:  00: 00: 00.00


SQL> delete from test1 where object_type = 'VIEW' and rownum <100;
SQL> delete from test2 where object_type = 'VIEW' and rownum <100;
SQL> commit;
SQL> select f1() from dual;
      F1()
----------
  59788330

已用时间:  00: 00: 07.09  --可以看到数据发生变化,即使不使用RELIES_ON,结果集也是正确的。


SQL> select count(*)
      from test1, test2
     where test1.object_type = test2.object_type
     and test1.object_type in ('TABLE SUBPARTITION','VIEW','INDEX','TABLE');
  COUNT(*)
----------
  59788330
已用时间:  00: 00: 03.56   



SQL> create or replace function f2
   return number
     result_cache RELIES_ON(test1,test2)
   is
     l_ret number;
   begin
     select count(*) into l_ret
      from test1,test2
    where test1.object_type = test2.object_type
    and test1.object_type in ('TABLE SUBPARTITION','VIEW','INDEX','TABLE');
     return l_ret;
   end;
   /
函数已创建。


SQL> select f2() from dual;
      F2()
----------
  59788330
已用时间:  00: 00: 03.54
SQL> select f2() from dual;
      F2()
----------
  59788330
已用时间:  00: 00: 00.00

SQL> delete from test1 where object_type = 'VIEW' and rownum <100;
SQL> delete from test2 where object_type = 'VIEW' and rownum <100;
SQL> commit;
SQL> select f2() from dual;
      F2()
----------
  58914853

已用时间:  00: 00: 03.50


SQL> select count(*)
      from test1, test2
     where test1.object_type = test2.object_type
     and test1.object_type in ('TABLE SUBPARTITION','VIEW','INDEX','TABLE');
  COUNT(*)
----------
  58914853
已用时间:  00: 00: 03.50

Oracle 11G PL/SQL

如果预显示更新后结果,执行下面语句:
select deptno,empno,sal,decode(deptno,10,'5%',20,'10%',30,'15%') "sal%",
decode(deptno,10,sal*1.05,20,sal*1.1,30,sal*1.15) newsal
from emp order by deptno,empno;
若要先更新再显示,需要在表结构中增加更新后的列newsal。否则无法输出更新前的薪金。
更新:update emp x newset sal=(select decode(deptno,10,sal*1.05,20,sal*1.1,30,sal*1.15)
from emp where empno=x.empno);
显示:select deptno,empno,sal,decode(deptno,10,'5%',20,'10%',30,'15%') "sal%",newsal
from emp order by deptno,empno;
 

PL/SQL 查询缓存问题

每次查询前清空缓存,试试:
10g以上:
alter system flush buffer_cache;
9i:
ALTER SESSION SET EVENTS 'immediate trace name flush_cache';
 

www.htsjk.Com true http://www.htsjk.com/shujukunews/2580.html NewsArticle Oracle 11g 的PL/SQL函数结果缓存,oracle11g 模仿Oracle性能诊断艺术中的例子做了两个试验,书上说如果不用 RELIES_ON,则函数依赖的对象发生的变更操作就不会导致结果缓存的失效操作( res...
相关文章
    暂无相关文章
评论暂时关闭