--************************************
-- Oracle 表緩存 (caching table) 的使用
--************************************
?
1. 使用 caching table 的原因
??????? 在通常的情況下,應(yīng)用程序訪問在 cache 中的數(shù)據(jù)塊將按照 LRU 算法來進(jìn)行處理。然而對(duì)于小表的訪問,當(dāng)使用全表掃描時(shí),則該表
??? 中的塊會(huì)放置 LRU 列表最近最少使用尾部的 ( LRU 端 ) ,因此很快就被淘汰出局。然而使用基于成本優(yōu)化的方法,對(duì)于小表進(jìn)行查詢以及收
??? 集統(tǒng)計(jì)信息,大多情形下走的是全表掃描,因此勢必造成一種情形,即該表后續(xù)需要再次訪問,而每次使用了全表掃描,而該對(duì)象很快
??? 被淘汰出局,因此需要再次讀入到 buffer cache ,耗用了大量的 I / O 。
???????????
2. 解決該問題的方法
??? 設(shè)計(jì)表為 caching table ,即使對(duì)該表使用全表訪問時(shí),則該表對(duì)象的塊仍然被放置在 LRU 列表最近最多使用的尾部 (MRU 段 )
??? 不要過度的使用 caching table ,以免造成性能下降
??? 通常將 caching table 存放在 keep buffer pool ,缺省的情況下會(huì)放置在 default buffer pool 。
???
3. 具有 cache 屬性與 pin 的差異
??? 對(duì)于具有 cache 屬性的對(duì)象,并不是將該對(duì)象 pin 到 cache 里,而是盡可能的延遲該對(duì)象駐留 cache 的時(shí)間
??? 而對(duì)于 pin 對(duì)象,則是將該對(duì)象常駐到內(nèi)存
???
4. 設(shè)計(jì) cache table 的方法
??? 創(chuàng)建表對(duì)象時(shí),使用 cache 子句
??? 修改表對(duì)象時(shí),使用 cache 子句
??? 使用 cache 提示
???
??? 創(chuàng)建表對(duì)象時(shí)使用 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 修改已經(jīng)存在的表
??????? alter table scott . emp cache ;
???????
??? ? 可以使用 nocache 來修改對(duì)象,使其不具備 cache 屬性
??????? alter table soctt . emp nocache
???????
??? ? 使用 hint 提示符來實(shí)現(xiàn) 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 一旦被 load 進(jìn) buffer cache 中,始終處于 LRU 的 MRU 端,盡可能的
??? 避免因 buffer cache 過小而被置換到 buffer cache 之外。
??????? 注意不同的演示環(huán)境可能有所差異,本人的演示環(huán)境如下 ;
??????????? 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 table 與 keep buffer pool 的異同
??? 兩者的目的都是盡可能將最熱的對(duì)象置于到 buffer pool ,盡可能的避免 aged out 。
??? cache table 是將對(duì)象置于到 default buffer cache 。
??? 而使用 buffer_pool keep 子句是將對(duì)象置于到 keep buffer pool 。
??? 當(dāng) buffer_pool 和 cache 同時(shí)指定時(shí), keep 比 cache 有優(yōu)先權(quán)。 buffer_pool 用來指定存貯使用緩沖池,而 cache/nocache 指定存儲(chǔ)的
??? 方式 (LRU 或 MRU 端 ) 。建表時(shí)候不注明的話, nocache 是默認(rèn)值。
?
7. 更多參考
有關(guān)閃回特性請(qǐng)參考
??????? Oracle 閃回特性(FLASHBACK DATABASE)
Oracle 閃回特性(FLASHBACK DROP & RECYCLEBIN)
Oracle 閃回特性(Flashback Query 、Flashback Table)
Oracle 閃回特性(Flashback Version 、Flashback Transaction)
?
有關(guān)基于用戶管理的備份和備份恢復(fù)的概念請(qǐng)參考:
??????? Oracle 冷備份
??????? Oracle 熱備份
??????? Oracle 備份恢復(fù)概念
??????? Oracle 實(shí)例恢復(fù)
??????? Oracle 基于用戶管理恢復(fù)的處理 ( 詳細(xì)描述了介質(zhì)恢復(fù)及其處理 )
???????
??? 有關(guān) RMAN 的恢復(fù)與管理請(qǐng)參考:
??????? RMAN 概述及其體系結(jié)構(gòu)
??????? RMAN 配置、監(jiān)控 與管理
??????? RMAN 備份詳解
??????? RMAN 還原與恢復(fù)
???????
??? 有關(guān) Oracle 體系結(jié)構(gòu)請(qǐng)參考:
??????? Oracle 實(shí)例和Oracle 數(shù)據(jù)庫(Oracle 體系結(jié)構(gòu))
??????? Oracle 表空間與數(shù)據(jù)文件
??????? Oracle 密碼文件
??????? Oracle 參數(shù)文件
Oracle 數(shù)據(jù)庫實(shí)例啟動(dòng)關(guān)閉過程
??????? Oracle 聯(lián)機(jī)重做日志文件(ONLINE LOG FILE)
??????? Oracle 控制文件(CONTROLFILE)
??????? Oracle 歸檔日志
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
