联系:QQ(5163721)
标题:Smart Flash Cache on Exadata(4)—使用flash cache
作者:Lunar©版权所有[文章允许转载,但必须以链接方式注明源地址,否则追究法律责任.]
对于表和索引,可以在创建表时使用storage子句将表保存在flashcache中,如果表已经创建完成了,那么可以使用alert table或者alert index命令进行修改相应对象的storage属性,将对象混存在flash cache中。
我做了两张测试表,他们数据的内容基本一直,不过一张是压缩表,一张是非压缩表:
11:14:16 SQL> set autot off 11:16:40 SQL> col segment_name for a30 11:16:41 SQL> select /*+ parallel(a,24) */ SEGMENT_NAME,SUM(BYTES)/1024/1024/1024 GB 11:16:41 2 FROM USER_EXTENTS 11:16:41 3 WHERE SEGMENT_NAME LIKE '%COMPRESS%' 11:16:41 4 GROUP BY SEGMENT_NAME; SEGMENT_NAME GB ------------------------------ ---------- LUNAR_UNCOMPRESS 17.234436 LUNAR_COMPRESS 1.27032471 11:31:22 SQL> select count(*) from LUNAR_UNCOMPRESS; COUNT(*) ---------- 155607456 Elapsed: 00:00:00.54 11:31:24 SQL> select count(*) from LUNAR_COMPRESS; COUNT(*) ---------- 155680188 Elapsed: 00:00:00.18 11:31:30 SQL> SQL> select table_name, compression, compress_for FROM user_tables where table_name like '%COMPRESS%'; TABLE_NAME COMPRESS COMPRESS_FOR ------------------------------ -------- ------------ LUNAR_UNCOMPRESS DISABLED LUNAR_COMPRESS ENABLED QUERY HIGH Elapsed: 00:00:00.07 SQL>
缓存对象到flash cache的语法如下(类似这样对象的IO,我们都称之为 ”Smart Scan I/Os” ):
--对于分区对象,可以缓存部分或者全部分表数据: CREATE TABLE lunar_par_tab (c1 number, c2 clob) TABLESPACE TBS_1 PARTITION BY RANGE(c1) ( PARTITION p1 VALUES LESS THAN (100) TABLESPACE TBS_2 STORAGE (CELL_FLASH_CACHE DEFAULT), PARTITION p2 VALUES LESS THAN (200) TABLESPACE TBS_3 STORAGE (CELL_FLASH_CACHE KEEP)); --对于lob对象,可以根据应用访问等具体情况确定是否需要缓存: CREATE TABLE lunar_lob_test (col1 number, col_lob clob) lob (col_lob) STORE AS securefile (cache nologging STORAGE (CELL_FLASH_CACHE NONE)) PCTFREE 0 TABLESPACE tbs_93 STORAGE (initial 128K next 128K pctincrease 0);
取消对象在flash cache的缓存:
alter TABLE LUNAR_TEST_PAR STORAGE (CELL_FLASH_CACHE none); alter INDEX IDX_LUNAR_TEST_PAR STORAGE (CELL_FLASH_CACHE none);
一般在POC或者生产上,我们会按照一定的条件(比如过滤掉超大的表或者分区等等)生成符合条件的表或者索引的keep 命令:
例如,使用下面的语句,将生成满足条件的表的缓存语句:
select 'alter table '||segment_name||' STORAGE (CELL_FLASH_CACHE keep);'
from dba_segments
where owner='LUNAR'
and segment_type in ('TABLE')
-- and TABLESPACE_NAME='DATA_DYNAMIC'
and segment_name not in ('TEST_TAB1','TEST_TAB2')
--group by owner||'.'||segment_name,segment_type
--having sum(bytes) > 1*1024*1024*1024
--order by sum(bytes)/1024/1024/1024;
alter table MM_LUNAR_TEMP_TEST STORAGE (CELL_FLASH_CACHE keep);
alter table MM_LUNAR_TEMP_TEST STORAGE (CELL_FLASH_CACHE keep);
…………
select 'alter INDEX '||segment_name||' STORAGE (CELL_FLASH_CACHE keep);'
from dba_segments
where owner='LUNAR'
and segment_type in ('INDEX')
-- and TABLESPACE_NAME='DATA_DYNAMIC'
--and segment_name not in ('TEST_TAB1','TEST_TAB2')
--group by owner||'.'||segment_name,segment_type
--having sum(bytes) > 1*1024*1024*1024
--order by sum(bytes)/1024/1024/1024;
alter INDEX IDX_LUNAR_TEST_PAR STORAGE (CELL_FLASH_CACHE keep);
alter INDEX IDX_LUNAR_TEST STORAGE (CELL_FLASH_CACHE keep);
…………
对于已经创建的对象,要修改其CELL_FLASH_CACHE属性,可以使用如下命令:
ALTER TABLE lunar_lob_test STORAGE( CELL_FLASH_CACHE DEFAULT); ALTER TABLE lunar_lob_test MODIFY LOB (col_lob) (STORAGE (CELL_FLASH_CACHE KEEP));
要知道当前对象的设置,可以查询dba_tables(all_tables, user_tables)或者dba_indexes(all_indexes, user_indexes)的CELL_FLASH_CACHE列:
SELECT TABLESPACE_NAME, TABLE_NAME, CELL_FLASH_CACHE FROM user_tables WHERE table_name='LUNAR_LOB_TEST'; SELECT CELL_FLASH_CACHE FROM ALL_INDEXES WHERE index_name='IDX_LUNAR_LOB_TEST';
还可以在cell上使用cellcli工具和命令” LIST FLASHCACHECONTENT”查看:
--(注意,cell的版本是11.2.3.2.1,是上周刚刚升级上来的,o(∩_∩)o 哈哈)
[root@dm02cel09 ~]# cellcli
CellCLI: Release 11.2.3.2.1 - Production on Tue May 28 11:24:29 CST 2013
Copyright (c) 2007, 2012, Oracle. All rights reserved.
Cell Efficiency Ratio: 416
CellCLI>
CellCLI> LIST FLASHCACHECONTENT WHERE objectNumber= 112912 DETAIL
--这说明该OBJECT_ID=112912对象没有被keep在flash cache上。
CellCLI> LIST FLASHCACHECONTENT WHERE objectNumber= 112913 DETAIL
cachedKeepSize: 0
cachedSize: 34340864
dbID: 722038086
dbUniqueName: DB06
hitCount: 652
missCount: 19377
objectNumber: 112913
tableSpaceNumber: 7
CellCLI>
我们注意到这里cachedKeepSize=0, 表示这个表曾经被cache了,后来执行了类似“alter table XXX STORAGE (CELL_FLASH_CACHE none);”的命令,取消的cache到flash cache的操作。
而上面的objectNumber= 112912没有任何输出,表示这个表没有被缓存过。
通常,POC或者生产上,我们更多的是生成批量查看对象缓存内容的语句:
11:23:17 SQL> select 'LIST FLASHCACHECONTENT WHERE objectNumber= '||b.object_id||' DETAIL'
11:23:18 2 from dba_segments a, dba_objects b
11:23:18 3 where a.owner='LUNAR'
11:23:18 4 and a.segment_name = b.OBJECT_NAME
11:23:18 5 and a.segment_type in ('TABLE')
11:23:18 6 and a.segment_name in ('LUNAR_UNCOMPRESS','LUNAR_COMPRESS')
11:23:18 7 /
'LISTFLASHCACHECONTENTWHEREOBJECTNUMBER='||B.OBJECT_ID||'DETAIL'
-------------------------------------------------------------------------------------------
LIST FLASHCACHECONTENT WHERE objectNumber= 112912 DETAIL
LIST FLASHCACHECONTENT WHERE objectNumber= 112913 DETAIL
具体我们看一下” LIST FLASHCACHE DETAIL”和”“ LIST FLASHCACHECONTENT”的官方说明:
CellCLI> DESCRIBE FLASHCACHE
name
cellDisk
creationTime
degradedCelldisks
effectiveCacheSize
id
size
status
CellCLI>
CellCLI> LIST FLASHCACHE DETAIL
name: dm02cel09_FLASHCACHE
cellDisk: FD_08_dm02cel09,FD_01_dm02cel09,FD_06_dm02cel09,FD_11_dm02cel09,
FD_00_dm02cel09,FD_12_dm02cel09,FD_05_dm02cel09,FD_07_dm02cel09,
FD_15_dm02cel09,FD_04_dm02cel09,FD_02_dm02cel09,FD_09_dm02cel09,
FD_13_dm02cel09,FD_10_dm02cel09,FD_14_dm02cel09,FD_03_dm02cel09
creationTime: 2012-08-10T16:03:25+08:00
degradedCelldisks: 需要关注这里是否有异常信息…………
effectiveCacheSize: 364.75G
id: 26514ed2-fa29-4b05-91b7-835f6180d6f3
size: 364.75G
status: normal
CellCLI>
查看Flash cache的内容:
CellCLI> DESCRIBE FLASHCACHECONTENT
cachedKeepSize
cachedSize
dbID
dbUniqueName
hitCount
hoursToExpiration
missCount
objectNumber
tableSpaceNumber
CellCLI>
CellCLI> LIST FLASHCACHECONTENT WHERE objectNumber= 112913 DETAIL
cachedKeepSize: 1315151872 被cache的对象大小为1.3G
cachedSize: 1315258368 该对象被用keep模式缓存的大小
dbID: 722038086
dbUniqueName: DB06
hitCount: 4541
hoursToExpiration: 24
missCount: 20676
objectNumber: 112913
tableSpaceNumber: 7
CellCLI>
CellCLI> LIST FLASHCACHECONTENT WHERE objectNumber= 112912 DETAIL
cachedKeepSize: 95485952
cachedSize: 95485952
dbID: 722038086
dbUniqueName: DB06
hitCount: 245
hoursToExpiration: 24
missCount: 545
objectNumber: 112912
tableSpaceNumber: 7
CellCLI>
当使用” STORAGE (CELL_FLASH_CACHE none)”子句取消对象在flash cache的缓存时:
SQL> ALTER table LUNAR_UNCOMPRESS STORAGE (CELL_FLASH_CACHE none); Table altered. Elapsed: 00:00:00.01 SQL> ALTER table LUNAR_COMPRESS STORAGE (CELL_FLASH_CACHE none); Table altered. Elapsed: 00:00:00.01 SQL>
可以看到cachedKeepSize的值立刻变成“0”:
CellCLI> LIST FLASHCACHECONTENT WHERE objectNumber= 112912 DETAIL
cachedKeepSize: 0
cachedSize: 95485952
dbID: 722038086
dbUniqueName: DB06
hitCount: 245
missCount: 545
objectNumber: 112912
tableSpaceNumber: 7
CellCLI> LIST FLASHCACHECONTENT WHERE objectNumber= 112913 DETAIL
cachedKeepSize: 0
cachedSize: 1315258368
dbID: 722038086
dbUniqueName: DB06
hitCount: 4541
missCount: 20676
objectNumber: 112913
tableSpaceNumber: 7
CellCLI>
看下这两个表的数据量,都在1.5亿行左右,没有索引情况下,count(*)的时间如下:
(当然,我这里测试不够严谨,应该每次执行前先执行清空buffer pool等)
SQL> select count(*) from LUNAR_COMPRESS; COUNT(*) ---------- 155680188 Elapsed: 00:00:23.67 SQL> SQL> select count(*) from LUNAR_UNCOMPRESS; COUNT(*) ---------- 155607456 Elapsed: 00:00:01.34 SQL>
修改为keep,再查看下:
SQL> ALTER table LUNAR_UNCOMPRESS STORAGE (CELL_FLASH_CACHE keep);
Table altered.
Elapsed: 00:00:00.07
SQL> ALTER table LUNAR_COMPRESS STORAGE (CELL_FLASH_CACHE keep);
Table altered.
Elapsed: 00:00:00.01
SQL>
--因为还没有访问,因此,这里cachedKeepSize依然是0:
CellCLI> LIST FLASHCACHECONTENT WHERE objectNumber= 112912 DETAIL
cachedKeepSize: 0
cachedSize: 95485952
dbID: 722038086
dbUniqueName: DB06
hitCount: 245
missCount: 1174
objectNumber: 112912
tableSpaceNumber: 7
CellCLI> LIST FLASHCACHECONTENT WHERE objectNumber= 112913 DETAIL
cachedKeepSize: 0
cachedSize: 1315258368
dbID: 722038086
dbUniqueName: DB06
hitCount: 4541
missCount: 24459
objectNumber: 112913
tableSpaceNumber: 7
CellCLI>
修改下会话的parallel选项(不指定具体的并行度,系统将使用缺省并行度),准备插入1000w行数据,测试下速度:
SQL> alter session force parallel query; Session altered. Elapsed: 00:00:00.00 SQL> alter session force parallel dml; Session altered. Elapsed: 00:00:00.00 SQL> alter session force parallel ddl; Session altered. Elapsed: 00:00:00.00 SQL>
插入1000w行数据,看下时间:
SQL> insert /*+ append parallel */ into LUNAR_COMPRESS 2 select /*+ parallel */ * from LUNAR_COMPRESS where rownum<=10000000; 3 10000000 rows created. Elapsed: 00:00:31.70 SQL> SQL> SQL> commit; Commit complete. Elapsed: 00:00:00.06 SQL> SQL> insert /*+ append parallel */ into LUNAR_UNCOMPRESS 2 select /*+ parallel */ * from LUNAR_UNCOMPRESS 3 where rownum<=10000000; 10000000 rows created. Elapsed: 00:00:27.84 SQL> SQL> commit; Commit complete. Elapsed: 00:00:00.08 SQL>
查看下对象大小:
SQL> col segment_name for a30 SQL> select SEGMENT_NAME,SUM(BYTES)/1024/1024/1024 GB 2 FROM USER_EXTENTS 3 WHERE sEGMENT_nAME LIKE '%COMPRESS%' 4 GROUP BY SEGMENT_NAME; SEGMENT_NAME GB ------------------------------ ---------- LUNAR_COMPRESS 1.45855713 LUNAR_UNCOMPRESS 19.4857178 Elapsed: 00:00:19.21 SQL>
可以查看下现在对象的cache情况:
可见,这时对象已经
CellCLI> LIST FLASHCACHECONTENT WHERE objectNumber= 112912 DETAIL
cachedKeepSize: 103546880
cachedSize: 103546880
dbID: 722038086
dbUniqueName: DB06
hitCount: 553
hoursToExpiration: 24
missCount: 1226
objectNumber: 112912
tableSpaceNumber: 7
CellCLI> LIST FLASHCACHECONTENT WHERE objectNumber= 112913 DETAIL
cachedKeepSize: 1495015424
cachedSize: 1496629248
dbID: 722038086
dbUniqueName: DB06
hitCount: 6234
hoursToExpiration: 24
missCount: 25126
objectNumber: 112913
tableSpaceNumber: 7
CellCLI>
SQL> select count(*) from LUNAR_COMPRESS;
COUNT(*)
----------
175680188
Elapsed: 00:00:00.27
SQL> select count(*) from LUNAR_UNCOMPRESS;
COUNT(*)
----------
175607456
Elapsed: 00:00:00.62
SQL>
Direct path insert缺省是不会缓存到Flash cache的,因此WriteBack和WriteThough模式的性能无差别。
未完,待续……
下一节,看看flash cache的监控和阀值…………


