Oracle 表缓存(caching table)的使用

--************************************

-- Oracle 表缓存(caching table)的使用

--************************************

 

1.使用caching table 的原因

        在通常的情况下,应用程序访问在cache中的数据块将按照LRU算法来进行处理。然而对于小表的访问,当使用全表扫描时,则该表

    中的块会放置LRU列表最近最少使用尾部的(LRU),因此很快就被淘汰出局。然而使用基于成本优化的方法,对于小表进行查询以及收

    集统计信息,大多情形下走的是全表扫描,因此势必造成一种情形,即该表后续需要再次访问,而每次使用了全表扫描,而该对象很快

    被淘汰出局,因此需要再次读入到buffer cache,耗用了大量的I/O

           

2.解决该问题的方法

    设计表为caching table ,即使对该表使用全表访问时,则该表对象的块仍然被放置在LRU列表最近最多使用的尾部(MRU)

    不要过度的使用caching table,以免造成性能下降

    通常将caching table 存放在keep buffer pool,缺省的情况下会放置在default buffer pool

   

3.具有cache属性与pin 的差异

    对于具有cache属性的对象,并不是将该对象pincache里,而是尽可能的延迟该对象驻留cache的时间

    而对于pin对象,则是将该对象常驻到内存

   

4.设计cache table 的方法

    创建表对象时,使用cache子句

    修改表对象时,使用cache子句

    使用cache 提示

   

    创建表对象时使用cache,如下面的例子

        create table tb_test

        (id number

         ,name varchar2(20)

         ,sex  char(1)

         ,age  number

         ,score number)

         tablespace users

         storage(initial 50k next 50k pctincrease 0)

         cache;    --指定cache子句

 

     使用alter table 修改已经存在的表

        alter table scott.emp cache;

       

     可以使用nocache来修改对象,使其不具备cache属性

        alter table soctt.emp nocache

       

     使用hint提示符来实现cache

        select /*+ cache*/ empno,ename from scott.emp;

   

5.使用例子演示caching table情形

 

    scott@ORCL> create table tb1 nologging

      2  as select level id,rpad('*',4000,'*') data,rpad('*',2000,'*') data2

      3  from dual

      4  connect by level <= 15000;

 

    Table created. 

 

    scott@ORCL> create table tb2

      2  cache nologging

      3  as select level id,rpad('*',4000,'*') data,rpad('*',2000,'*') data2

      4  from dual

      5  connect by level <= 15000;

 

    Table created.

 

    scott@ORCL> select count(1) from tb1;

 

      COUNT(1)

    ----------

         15000

 

    scott@ORCL> select count(1) from tb2;

 

      COUNT(1)

    ----------

         15000

 

    scott@ORCL> select table_name,num_rows,cache from user_tables where table_name in ('TB1','TB2');

 

    TABLE_NAME        NUM_ROWS CACHE

    --------------- ---------- -----

    TB1                  15000     N

    TB2                  15000     Y

         

    scott@ORCL> set autotrace traceonly statistics;

    scott@ORCL> select count(1) from tb1;

 

    Statistics

    ----------------------------------------------------------

              5  recursive calls

              0  db block gets

          15086  consistent gets

          15000  physical reads

              0  redo size

            412  bytes sent via SQL*Net to client

            385  bytes received via SQL*Net from client

              2  SQL*Net roundtrips to/from client

              0  sorts (memory)

              0  sorts (disk)

              1  rows processed

             

    scott@ORCL> select count(1) from tb1;

 

    Statistics

    ----------------------------------------------------------

              0  recursive calls

              0  db block gets

          15011  consistent gets

          15000  physical reads

              0  redo size

            412  bytes sent via SQL*Net to client

            385  bytes received via SQL*Net from client

              2  SQL*Net roundtrips to/from client

              0  sorts (memory)

              0  sorts (disk)

              1  rows processed    

 

    scott@ORCL> select count(1) from tb2;

 

    Statistics

    ----------------------------------------------------------

              0  recursive calls

              0  db block gets

          15011  consistent gets

            197  physical reads

              0  redo size

            412  bytes sent via SQL*Net to client

            385  bytes received via SQL*Net from client

              2  SQL*Net roundtrips to/from client

              0  sorts (memory)

              0  sorts (disk)

              1  rows processed

 

    scott@ORCL> select count(1) from tb2;

 

    Statistics

    ----------------------------------------------------------

              0  recursive calls

              0  db block gets

          15011  consistent gets

              0  physical reads

              0  redo size

            412  bytes sent via SQL*Net to client

            385  bytes received via SQL*Net from client

              2  SQL*Net roundtrips to/from client

              0  sorts (memory)

              0  sorts (disk)

              1  rows processed      

   

        从上面的示例中可以看出,表tb1每次都将使用相同的物理读,而表tb2一旦被loadbuffer cache中,始终处于LRUMRU端,尽可能的

    避免因buffer cache过小而被置换到buffer cache之外。

        注意不同的演示环境可能有所差异,本人的演示环境如下;

            scott@ORCL> show parameter sga_

 

            NAME                                 TYPE        VALUE

            ------------------------------------ ----------- ------------------------------

            sga_max_size                         big integer 264M

            sga_target                           big integer 264M

            scott@ORCL> select * from v$version;

 

            BANNER

            ----------------------------------------------------------------

            Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod

            PL/SQL Release 10.2.0.1.0 - Production

            CORE    10.2.0.1.0      Production

            TNS for Linux: Version 10.2.0.1.0 - Production

            NLSRTL Version 10.2.0.1.0 - Production         

         

6.注意cache tablekeep buffer pool的异同

    两者的目的都是尽可能将最热的对象置于到buffer pool,尽可能的避免aged out

    cache table是将对象置于到default buffer cache

    而使用buffer_pool keep子句是将对象置于到keep buffer pool

    buffer_poolcache同时指定时,keepcache有优先权。buffer_pool用来指定存贮使用缓冲池,而cache/nocache指定存储的

    方式(LRUMRU)。建表时候不注明的话,nocache是默认值。

 

7.更多参考

有关闪回特性请参考

        Oracle 闪回特性(FLASHBACK DATABASE)

Oracle 闪回特性(FLASHBACK DROP & RECYCLEBIN)

Oracle 闪回特性(Flashback Query、Flashback Table)

Oracle 闪回特性(Flashback Version、Flashback Transaction)

 

有关基于用户管理的备份和备份恢复的概念请参考:

        Oracle 冷备份

        Oracle 热备份

        Oracle 备份恢复概念

        Oracle 实例恢复

        Oracle 基于用户管理恢复的处理(详细描述了介质恢复及其处理)

       

    有关RMAN的恢复与管理请参考:

        RMAN 概述及其体系结构

        RMAN 配置、监控与管理

        RMAN 备份详解

        RMAN 还原与恢复

       

    有关Oracle体系结构请参考:

        Oracle 实例和Oracle数据库(Oracle体系结构)

        Oracle 表空间与数据文件

        Oracle 密码文件

        Oracle 参数文件

Oracle 数据库实例启动关闭过程

        Oracle 联机重做日志文件(ONLINE LOG FILE)

        Oracle 控制文件(CONTROLFILE)

        Oracle 归档日志

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
flask_caching是一个Flask扩展,用于缓存应用程序的数据。它提供了多种缓存选项,包括内存缓存、磁盘缓存、Redis缓存等等。以下是使用flask_caching的简单示例: 1. 安装flask_caching扩展 ```python pip install flask_caching ``` 2. 在Flask应用程序初始化缓存 ```python from flask import Flask from flask_caching import Cache app = Flask(__name__) # 初始化缓存使用默认配置 cache = Cache(app) @app.route('/') @cache.cached(timeout=60) # 设置缓存时间为60秒 def index(): return 'Hello, World!' ``` 3. 在视图函数使用缓存 在上面的代码,我们使用`@cache.cached`装饰器将`index`视图函数缓存起来。这意味着当访问根路由时,如果缓存有数据,那么直接返回缓存的数据,否则执行视图函数并将返回结果缓存起来。 4. 更多缓存选项 除了上面的`cached`方法,flask_caching还提供了其他方法用于缓存数据,包括: - `cache.memoize`: 与`cached`方法类似,但可以自定义缓存键名。 - `cache.add`: 将数据添加到缓存,如果缓存已经存在,则返回False。 - `cache.get`: 从缓存获取数据。 - `cache.set`: 将数据设置到缓存。 除了以上缓存方法,flask_caching还提供了一些其他的配置选项,例如缓存的过期时间、缓存的类型(如内存缓存、磁盘缓存、Redis缓存)、缓存键名的前缀等等。有关更多信息,请参阅flask_caching的官方文档。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值