Variable size extents enable support for larger ASM datafiles, reduce SGA memory requirements for very large databases, and improve performance for file create and open operations. The size of the extent map that defines a file can be smaller by a factor of 8 and 64 depending on the file size. The initial extent size is equal to the allocation unit size and it increases by a factor of 8 and 64 at predefined thresholds.This feature is automatic for newly created and resized datafiles when the disk group compatibility attributes are set to Oracle Release 11 or higher. For information about compatibility attributes, see “Disk Group Compatibility”.
For 11.1 shows the ASM file extent relationship with allocation units. Extent size is always equal to AU for the first 20000 extent sets (0 – 19999). Figure 1-4 shows the first eight extents (0 to 7) distributed on four ASM disks. After the first 20000 extent sets, the extent size becomes 8*AU for next 20000 extent sets (20000 – 39999). This is shown as bold rectangles labeled with the extent set numbers 20000 to 20007, and so on. The next increment for an ASM extent is 64*AU (not shown in the figure).
The ASM coarse striping is always equal to the disk group AU size, but fine striping size always remains 128KB in any configuration (not shown in the figure). The AU size is determined at creation time with the allocation unit size (AU_SIZE) disk group attribute. The values can be 1, 2, 4, 8, 16, 32, and 64 MB.
FOR 11.2:
The extent size of a file varies as follows:
Extent size always equals the disk group AU size for the first 20000 extent sets (0 – 19999).
Extent size equals 4*AU size for the next 20000 extent sets (20000 – 39999).
Extent size equals 16*AU size for the next 20000 and higher extent sets (40000+)
如绿字所标记 Variable Extent Size要求DATABASE_COMPATIBILITY 》=11.1,否则不管你构建多大的数据文件 最后其Extent Size总是等于1个AU的。
SQL> select * from x$kffxp where size_kffxp!=1 and rownum<3;
ADDR INDX INST_ID GROUP_KFFXP NUMBER_KFFXP COMPOUND_KFFXP INCARN_KFFXP PXN_KFFXP XNUM_KFFXP LXN_KFFXP DISK_KFFXP AU_KFFXP FLAGS_KFFXP CHK_KFFXP SIZE_KFFXP
---------------- ---------- ---------- ----------- ------------ -------------- ------------ ---------- ---------- ---------- ---------- ---------- ----------- ---------- ----------
00007F6FCB2557F0 54983 1 1 6345 16783561 838455287 40000 20000 0 4 17036 0 224 4
00007F6FCB2557F0 54984 1 1 6345 16783561 838455287 40001 20000 1 0 3888 0 21 4
如上述查询 size_kffxp 为Extent的大小(几个AU)。 这些EXTENT对应于FILE NUMBER 6345:
[oracle@mlab2 ~]$ kfed read /dev/asm-disk9 aun=22 blkn=201|less
kfbh.endian: 1 ; 0x000: 0x01
kfbh.hard: 130 ; 0x001: 0x82
kfbh.type: 4 ; 0x002: KFBTYP_FILEDIR
kfbh.datfmt: 1 ; 0x003: 0x01
kfbh.block.blk: 6345 ; 0x004: blk=6345
kfbh.block.obj: 1 ; 0x008: file=1
kfbh.check: 2648198861 ; 0x00c: 0x9dd84ecd
kfbh.fcn.base: 1506490 ; 0x010: 0x0016fcba
kfbh.fcn.wrap: 0 ; 0x014: 0x00000000
kfbh.spare1: 0 ; 0x018: 0x00000000
kfbh.spare2: 0 ; 0x01c: 0x00000000
kfffdb.node.incarn: 838455287 ; 0x000: A=1 NUMM=0x18fce7fb
kfffdb.node.frlist.number: 4294967295 ; 0x004: 0xffffffff
kfffdb.node.frlist.incarn: 0 ; 0x008: A=0 NUMM=0x0
kfffdb.hibytes: 5 ; 0x00c: 0x00000005
kfffdb.lobytes: 1073750016 ; 0x010: 0x40002000
kfffdb.xtntcnt: 40768 ; 0x014: 0x00009f40
kfffdb.xtnteof: 40768 ; 0x018: 0x00009f40
kfffdb.blkSize: 8192 ; 0x01c: 0x00002000
kfffdb.flags: 17 ; 0x020: O=1 S=0 S=0 D=0 C=1 I=0 R=0 A=0
kfffdb.fileType: 2 ; 0x021: 0x02
kfffdb.dXrs: 18 ; 0x022: SCHE=0x1 NUMB=0x2
kfffdb.iXrs: 19 ; 0x023: SCHE=0x1 NUMB=0x3
kfffdb.dXsiz[0]: 20000 ; 0x024: 0x00004e20
kfffdb.dXsiz[1]: 20000 ; 0x028: 0x00004e20
kfffdb.dXsiz[2]: 4294967288 ; 0x02c: 0xfffffff8
kfffdb.iXsiz[0]: 4294967295 ; 0x030: 0xffffffff
kfffdb.iXsiz[1]: 0 ; 0x034: 0x00000000
kfffdb.iXsiz[2]: 0 ; 0x038: 0x00000000
kfffdb.xtntblk: 63 ; 0x03c: 0x003f
kfffdb.break: 60 ; 0x03e: 0x003c
kfffdb.priZn: 0 ; 0x040: KFDZN_COLD
kfffdb.secZn: 0 ; 0x041: KFDZN_COLD
kfffdb.ub2spare: 0 ; 0x042: 0x0000
kfffdb.alias[0]: 6998 ; 0x044: 0x00001b56
kfffdb.alias[1]: 4294967295 ; 0x048: 0xffffffff
kfffdb.strpwdth: 8 ; 0x04c: 0x08
kfffdb.strpsz: 20 ; 0x04d: 0x14
kfffdb.usmsz: 0 ; 0x04e: 0x0000
kfffdb.crets.hi: 32999496 ; 0x050: HOUR=0x8 DAYS=0x2 MNTH=0x2 YEAR=0x7de
kfffdb.crets.lo: 988212224 ; 0x054: USEC=0x0 MSEC=0x1bb SECS=0x2e MINS=0xe
kfffdb.modts.hi: 32999500 ; 0x058: HOUR=0xc DAYS=0x2 MNTH=0x2 YEAR=0x7de
kfffdb.modts.lo: 0 ; 0x05c: USEC=0x0 MSEC=0x0 SECS=0x0 MINS=0x0
kfffdb.dasz[0]: 0 ; 0x060: 0x00
kfffdb.dasz[1]: 2 ; 0x061: 0x02
kfffdb.dasz[2]: 4 ; 0x062: 0x04
kfffdb.dasz[3]: 0 ; 0x063: 0x00
kfffdb.permissn: 0 ; 0x064: 0x00
kfffdb.ub1spar1: 0 ; 0x065: 0x00
kfffdb.ub2spar2: 0 ; 0x066: 0x0000
kfffdb.user.entnum: 0 ; 0x068: 0x0000
kfffdb.user.entinc: 0 ; 0x06a: 0x0000
kfffdb.group.entnum: 0 ; 0x06c: 0x0000
kfffdb.group.entinc: 0 ; 0x06e: 0x0000
/* -------------------------------- kfdasz --------------------------------- */
/*
NAME
kfdasz - Kernel Files Disk Au SiZe.
DESCRIPTION
Enumerates the possible AU size multiples which may be used for
Multi-AU "buddied" extents.
NOTES
The AU size multiple value may be determined by using the
KFDASZ_VALUE macro.
*/
#ifndef KFDASZ_1X
/* 10g had space for four sizes, but only 1x was used. The remaining sizes
* are new in 11, but 10g never references them, so it is safe to change the
* values
*/
#define KFDASZ_1X ((kfdasz)0) /* 1x AU size */
#define KFDASZ_2X ((kfdasz)1) /* 2x AU size */
#define KFDASZ_4X ((kfdasz)2) /* 4x AU size */
#define KFDASZ_8X ((kfdasz)3) /* 8x AU size */
#define KFDASZ_16X ((kfdasz)4) /* 16x AU size */
#define KFDASZ_32X ((kfdasz)5) /* 32x AU size */
#define KFDASZ_64X ((kfdasz)6) /* 64x AU size */
#define KFDASZ_LAST ((kfdasz)7) /* First unused value 11g */
#define KFDASZ_LAST_10 ((kfdasz)4) /* First unused value 10g */
#define KFDASZ_VALUE(x) ((ub1)(1 << (x)))
#endif /* KFDASZ_1X */
An extent is composed of one or more allocation units (AUs). An extent can be 1 AU, 4 AUs, 16 AUs, or 64 AUs. The extent size is encoded in two bits of the flags field as a kfdasz enumeration.