zoukankan      html  css  js  c++  java
  • 11g新特性之服务器结果缓存(result cache)

    以前对oracle结果缓存这个特性没注意过,最近项目中有个地方刚好用了一下,效果很不错,这里总结一下。
    服务器端结果缓存
    服务器端结果缓存实在共享池中的一段内存区域,用于缓存sql或pl/sql函数的执行结果
    工作原理
    当查询开始执行的时候,首先在结果缓存中区查找看有没有先前的执行结果,如果结果存在,服务器直接返回结果而不是再次执行查询。如果查询结果不存在,服务器才去执行查询,并且看情况缓存执行结果。
    当语句重复执行时,结果缓存的作用会时响应时间飞快。当缓存依赖的项目做过ddl,dml操作后,缓存结果就会失效。
    result cache配置,oracle实例在共享池中分配result cache,
    1.内存管理为Automatic shared memory managemen
    数据库分配SGA_TARGET的0.50%给result cache。
    2.内存管理为Manual shared memory management
    数据库分配 SHARED_POOL_SIZE 的1%给result cache。
    result cache管理方法
    result cache会一直增长到它的上限,如果查询结果的大小大于可用的result cache内存,服务器不会缓存这个结果。
    服务器使用LRU算法管理管理result cache,但是不会从结果缓存中自动释放内存。
    三个初始化参数
    RESULT_CACHE_MAX_SIZE:设定能分配给result cache的上限。
    RESULT_CACHE_MAX_RESULT 缓存的最大条目数。
    RESULT_CACHE_REMOTE_EXPIRATION
    定义result cache依赖于远程对象的失效时间,默认为0s,即依赖于远程对象的查询结果不会缓存。

    结果缓存可以使用 DBMS_RESULT_CACHE 包管理。
    显示result cache的统计信息
    SQL> SET SERVEROUTPUT ON
    SQL> EXECUTE DBMS_RESULT_CACHE.MEMORY_REPORT

    清理result cache
    DBMS_RESULT_CACHE.FLUSH
    结果缓存模式

    RESULT_CACHE_MODE有manual 和 force
    manual 是需要加/*+ RESULT_CACHE */提示后,结果才会缓存。
    force 所有的结果都会缓存,/*+ NO_RESULT_CACHE */。

    result cache的限制
    1.查询中的表有临时表,或表在sys或system下的不会缓存。
    2.sql查询中带有Sequence,CURRENT_DATE, CURRENT_TIMESTAMP, LOCAL_TIMESTAMP, USERENV/SYS_CONTEXT (with non-constant variables), SYS_GUID, SYSDATE, and SYS_TIMESTAMP 等结果不固定的函数。

    测试 select /*+ result_cache*/ count(distinct owner) from testtab;

    第二次执行

    可见第二几乎不费时间。

    pl/sql函数结果缓存。

    测试函数定义如下。

    create or replace function fun_wxc(p1 in varchar2) 
    return number result_cache 
    is
      rs number;
    begin
      rs := p1;
      /*模拟做一些耗时操作*/
      sys.dbms_lock.sleep(10);
      return rs;
    end;
    

     

    第一次执行为10s
    再次执行瞬间出结果。

  • 相关阅读:
    cocos2d与cocos2d-X中的draw和update
    poj1673
    hdu2128之BFS
    常用的js效验
    OMCS的语音视频带宽占用
    UML类图详细介绍
    [置顶] 获取激活码,激活myeclipse
    CBO学习----03--选择率(Selectivity)
    notepad++ 文件对比插件
    永远不要在Linux 执行的 10 个最危险的命令
  • 原文地址:https://www.cnblogs.com/wangxingc/p/6179224.html
Copyright © 2011-2022 走看看