性能优化最好的书就是官方文档。官方文档每一句话都值得引起我们深思。
Allocation Units
When you create a disk group, you can set the Oracle ASM allocation unit size with
the AU_SIZE disk group attribute. The values can be 1, 2, 4, 8, 16, 32, or 64 MB,
depending on the specific disk group compatibility level. Larger AU sizes typically
provide performance advantages for data warehouse applications that use large
sequential reads.
设置较大的AU能提升数据仓库应用中顺序读性能。在生成环境中,数据仓库IO绝大部分都是顺序读,而且是大量的顺序读。所以在创建数据库的时候,
设置正确的AU非常重要。那么现在我来测试一下设置不同的AU对性能的影响。
说来惭愧,我这个测试是在虚拟机上做的。
Oracle 11.2.0.1 block size 32k
Virtual Box 4.1.16
8块2G虚拟磁盘组成ASM DISK GROUP
加载数据 3.94Gb
创建AU=1M b的表空间
SQL>CREATEBIGFILETABLESPACE test_au1DATAFILE'+DATA_AU1/test.dbf'
SIZE4GNOLOGGINGONLINEPERMANENTBLOCKSIZE32768
EXTENTMANAGEMENTLOCALUNIFORMSIZE1048576DEFAULT
compress SEGMENTSPACEMANAGEMENTAUTO; 2 3 4
Tablespace created.
Elapsed:00:01:43.19
加载速度
经过时间为:00: 06: 37.89
CPU时间为:00:01:34.32
读取速度
SQL>altersystemflush buffer_cache;
System altered.
Elapsed: 00:00:00.07
SQL>selectcount(*)fromtest;
COUNT(*)
----------
37127168
Elapsed: 00:00:29.82
SQL> /
COUNT(*)
----------
37127168
Elapsed: 00:00:29.57
创建AU=4M 的表空间
SQL>CREATEBIGFILETABLESPACE test_au4DATAFILE'+DATA_AU4/test.dbf'
SIZE4GNOLOGGINGONLINEPERMANENTBLOCKSIZE32768
EXTENTMANAGEMENTLOCALUNIFORMSIZE4194304DEFAULT
compress SEGMENTSPACEMANAGEMENTAUTO; 2 3 4
Tablespace created.
Elapsed: 00:01:19.01
加载速度
经过时间为:00:06:49.30
CPU时间为:00:01:29.42
读取速度
SQL>altersystemflush buffer_cache;
System altered.
Elapsed: 00:00:00.07
SQL>selectcount(*)fromtest;
COUNT(*)
----------
37127168
Elapsed: 00:00:20.04
SQL> /
COUNT(*)
----------
37127168
Elapsed: 00:00:19.86
创建AU=8M b的表空间
SQL>CREATEBIGFILETABLESPACE test_au8DATAFILE'+DATA_AU8/test.dbf'
SIZE4GNOLOGGINGONLINEPERMANENTBLOCKSIZE32768
EXTENTMANAGEMENTLOCALUNIFORMSIZE8388608DEFAULT
compress SEGMENTSPACEMANAGEMENTAUTO; 2 3 4
Tablespace created.
Elapsed: 00:01:12.34
加载速度
经过时间为:00:06:12.34
CPU时间为:00:01:28.82
读取速度
SQL>altersystemflush buffer_cache;
System altered.
Elapsed: 00:00:00.06
SQL>selectcount(*)fromtest;
COUNT(*)
----------
37127168
Elapsed: 00:00:18.45
SQL> /
COUNT(*)
----------
37127168
Elapsed: 00:00:18.64
创建AU=16M b的表空间
SQL>CREATEBIGFILETABLESPACE test_au16DATAFILE'+DATA_AU16/test.dbf'
SIZE4GNOLOGGINGONLINEPERMANENTBLOCKSIZE32768
EXTENTMANAGEMENTLOCALUNIFORMSIZE16777216DEFAULT
compress SEGMENTSPACEMANAGEMENTAUTO; 2 3 4
Tablespace created.
Elapsed: 00:01:08.27
加载时间
经过时间为:00:07:02.20
CPU时间为:00:01:30.01
读取时间
SQL>altersystemflush buffer_cache;
System altered.
Elapsed: 00:00:00.11
SQL>selectcount(*)fromtest;
COUNT(*)
----------
37127168
Elapsed: 00:00:17.79
SQL> /
COUNT(*)
----------
37127168
Elapsed: 00:00:17.65
创建AU=32M b的表空间
SQL>CREATEBIGFILETABLESPACE test_au32DATAFILE'+DATA_AU32/test.dbf'
SIZE4GNOLOGGINGONLINEPERMANENTBLOCKSIZE32768
EXTENTMANAGEMENTLOCALUNIFORMSIZE33554432DEFAULT
compress SEGMENTSPACEMANAGEMENTAUTO; 2 3 4
Tablespace created.
Elapsed: 00:01:10.84
加载时间
经过时间为:00:06:48.11
CPU时间为:00:01:34.97
读取时间
SQL>altersystemflush buffer_cache;
System altered.
Elapsed: 00:00:00.08
SQL>selectcount(*)fromtest;
COUNT(*)
----------
37127168
Elapsed: 00:00:17.16
SQL> /
COUNT(*)
----------
37127168
Elapsed: 00:00:16.81
从实验上可知,如果OLAP环境设置AU=1Mb,那么悲剧去吧
AU=1Mb 读取速度接近30秒
AU=4Mb 读取速度接近20秒
AU=8MB 读取速度接近19秒
AU=16MB 读取速度接近18秒
AU=32Mb 读取速度接近17秒
数据加载速度都差不多,创建表空间的时候AU越大,速度越快,也就是说设置较大的AU,数据文件resize的时候也更快。表空间自动增长的情况下,大的AU也增长更快。
结论:
在数据仓库应用中,用ASMCA创建DISK GROUP的时候一定要设置AU(默认为1)>=4 。
Oracle官方文档推荐设置AU=4,其实我也推荐设置AU=4,因为从实验上看AU=4开始,顺序读取速度并没有因为AU的增加而显著增加。