6.8 可变大小区(Variable-Size Extents)(4)
也就是该磁盘组有8块磁盘,A、B、C表示不同的Stripe Chunk,每个chunk为128K大小。某ASM file的第一个chunk分配在disk1的第1个ASM file extent中,第2个chunk分配在disk2的第一个extent中,按此规律,一直分配到第8个chunk在disk8的第一个extent中,接下来第9个chunk(也就是上图中的I)又分配在disk1的第一个extent中,依次分配,直到该ASM file被完全条带化。
至于条带分配的宽度(如上例中是8),则由隐含参数_asm_stripewidth来决定,该参数默认值为8,通常我们不会修改该参数值。
由前面所讲述的背景知识我们知道,oracle在database instance的shared pool里存储extent map block,且extent map block和extent是一一对应的关系(在默认AU大小的情况下,一个extent的大小就是1M),如果我现在库的大小是1T,则我们可以计算出现在share pool里需要维护100万个extent map block。
Oracle意识到如果用ASM管理一个1T的库就需要维护100万个extent map block话,那随着所管理的库的容量越来越大,效率问题不容忽视。
MOS文档365468.1中这样写到:ASM metadata storage requirements for databases greater than 10TB can be very high introducing inefficiencies in opening ASM files and increasing memory used for ASM metadata。
于是在11g中,Oracle改变了extent的大小,extent的大小将不再永远是1MB,而是会随着分配extent数量的递增而改变。在Oracle Database 11gR1中的具体规则如表6-1所示。
表6-1 Oracle 11gR1中的规则
区 编 号 | AU数量 | 区大小(au=1MB) |
0~19 999 | 1 | 1MB |
20 000~39 999 | 8 | 8MB |
> 40 000 | 64 | 64MB |
其示意图如图6-27所示(引自Oracle Database Storage Administrator's Guide 11g),可以看到自第20000个Extent开始,分配了8个AU单位。
图6-27 Oracle Database 11gR1中的规则示意图 |
我们可以稍微计算一下在Oracle 11gR1中相应的extent分配的情况。
AU=1MB,库的大小为1TB,则按照上述算法,oracle现在仅需分配53572个extent
- SQL> select 20000+20000+(1024*1024-20000-20000*8) /64 Extents from dual;
- EXTENTS
- ----------
- 53571.5
AU=64MB(在Oracle 11g中在创建disk group时可以手工指定AU的大小),库的大小为1TB时,则按照上述算法,oracle现在仅需分配16384个extent:
- SQL> select (1024*1024/64) extents from dual;
- EXTENTS
- --------------
- 16384
AU=64MB(在Oracle 11g中在创建disk group时可以手工指定AU的大小),库的大小为100TB,则按照上述算法,oracle现在仅需分配62788个extent:
- SQL> select 20000 + 20000 + (100*1024*1024-20000*64 -20000*64*8)/(64*64) EXTENTS from dual;
- EXTENTS
- ------------------------------
- 62787.5
在Oracle 11gR2中,规则又有所变化,具体如表6-2所示。
表6-2 Oracle 11gR2中的规则变化
区 编 号 | AU数量 | 区大小(au = 1MB) |
0~19 999 | 1 | 1MB |
20 000~39 999 | 4 | 4MB |
> 40 000 | 16 | 16MB |
使用1MB的AU和固定大小区,对于10TB的数据库,大约需要90M来存储Extent Map;而对于16MB的AU,Extent Map仅占用大约5.5MB内存。Oracle在11g里引入了"可变的区大小"技术,可以显著缩短数据库的启动时间、降低Shared Pool的内存消耗,并且一举解决了以前在10g里用ASM来管理海量数据时候的效率问题(因为extent map block的数量再也不会像以前那样动辄上百万了)。