本文主要是介绍TimesTen只读缓存组在初始加载时会检查Aging吗?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
先说为什么要问这个问题,用户的Oracle数据库中有一个非常大的表,存1年的数据,每天1000万条记录。现在需要用TimesTen来做只读缓存,但只需缓存最近一个月的数据,因此申请的内存也只够缓存1个月的。
那么如果TimesTen在初始加载时,先加载所有数据,然后再使用Aging清除数据。那么加载所有数据这一步就会失败,因为内存不过;而且这么做显得有点多余。
所以按照逻辑来说,应该在初始加载时就会利用Aging排除掉不满足条件的数据。
下面来验证一下。
先在Oracle中创建基础表,然后插入1000条数据,注意插入是倒序的,每月一条
create table orders(ord_num int primary key,ship_time date not null);
grant select on orders to cacheadm;DECLAREord_num NUMBER;
BEGINFOR i IN 1..1000 LOOPSELECTnvl(MAX(ord_num), 0)INTO ord_numFROMorders;INSERT INTO orders VALUES (ord_num + 1,ADD_MONTHS(sysdate,-i));COMMIT;END LOOP;
END;
/SQL> select * from orders;ORD_NUM SHIP_TIME
---------- ---------1 23-NOV-202 23-OCT-203 23-SEP-204 23-AUG-205 23-JUL-206 23-JUN-207 23-MAY-208 23-APR-209 23-MAR-2010 23-FEB-2011 23-JAN-20
...
然后创建只读缓存组,启用Aging为1年,清理周期为10分钟:
CREATE READONLY CACHE GROUP "READCACHE" AUTOREFRESH MODE INCREMENTAL INTERVAL 5 MINUTESSTATE PAUSEDFROM"ORATT"."ORDERS" ("ORD_NUM" NUMBER(38) NOT NULL,"SHIP_TIME" DATE NOT NULL,PRIMARY KEY("ORD_NUM"))AGING USE SHIP_TIME LIFETIME 366 days CYCLE 10 minutes ONCommand> select * from orders;
0 rows found.
初始加载(LOAD CACHE GROUP ),发现只加载了满足条件的数据,这正是我们要的结果:
Command> select * from orders;
< 1, 2020-11-23 20:38:12 >
< 2, 2020-10-23 20:38:12 >
< 3, 2020-09-23 20:38:12 >
< 4, 2020-08-23 20:38:12 >
< 5, 2020-07-23 20:38:12 >
< 6, 2020-06-23 20:38:12 >
< 7, 2020-05-23 20:38:12 >
< 8, 2020-04-23 20:38:12 >
< 9, 2020-03-23 20:38:12 >
< 10, 2020-02-23 20:38:12 >
< 11, 2020-01-23 20:38:12 >
< 12, 2019-12-23 20:38:12 >
12 rows found.
在手册中关于LOAD CACHE GROUP 的帮助为:
LOAD CACHE GROUP loads all new cache instances from the Oracle database that satisfy the cache group definition and are not yet present in the cache group.
最后补充一点,如果想修改Aging生命周期和检查频率,可使用alter table
,可见这些属性都是表的属性,而非缓存组的属性。例如:
alter table "ORATT"."ORDERS"set aging lifetime 1 days;
alter table "ORATT"."ORDERS"set aging cycle 6 hours
这篇关于TimesTen只读缓存组在初始加载时会检查Aging吗?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!