在默认情况下创建的数据库块大小是由db_block_size参数决定的,一般默认是8k,即8192。db_block_size参数在建库时设置好后,就无法更改。这时候如果我们想要创建16k的表空间用来存放索引,那又该怎么办呢?
DB_BLOCK_SIZE参数
SQL> show parameter db_block_size NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_block_size integer 8192 SQL>
db_block_size是指定一个Oracle DB块的大小(字节)。此值是在创建数据库时设置的,此后不可更改。此值指定了数据库的标准块大小。所有表空间默认情况下将使用该大小。取值范围:2048到32768(与操作系统相关),即32位操作系统,最大为16k,64位系统最大为32k。默认值:8192 。
表空间的数据文件容量的大小是由db_block_size决定的。
smallfile tablespace的数据文件最大值为 4194304×DB_BLOCK_SIZE/1024M。
即:
4k最大数据文件为:16384M=16G
8K最大数据文件为:32768M=32G
16k最大数据文件为:65536M=64G
32K最大数据文件为:131072M=128G
DB_nK_CACHE_SIZE参数
Oracle是可以配置Multiple Block Sizes的
SQL> show parameter cache_size NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ client_result_cache_size big integer 0 db_16k_cache_size big integer 0 db_2k_cache_size big integer 0 db_32k_cache_size big integer 0 db_4k_cache_size big integer 0 db_8k_cache_size big integer 0 db_cache_size big integer 0 db_flash_cache_size big integer 0 db_keep_cache_size big integer 0 db_recycle_cache_size big integer 0
如果要配置Multiple Block Sizes,就要配置db_nk_cache_size参数,这些参数默认值都是 0。
db_nk_cache_size参数指定nK的buffer,在指定cache时,要确保有足够的空间。而且不能和db_block_siez参数冲突,n的取值范围是2、4、8、16、32 。
实验:
我们这里以16k为例
1. 查看db_block_siez
SQL> show parameter db_block_size NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_block_size integer 8192
2. 查看系统位数
[root@ocm ~]# cat /proc/cpuinfo | grep flags | grep 'lm' | wc -l 1
结果大于0,说明支持64位计算。
3. 查看db_16k_cache_size参数的默认值
SQL> show parameter db_16k_cache_size NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_16k_cache_size big integer 0
该参数默认值为0,表示未启用。
4. 创建数据库高速缓存区
SQL> alter system set db_16k_cache_size=1m scope=both; 系统已更改。 SQL> show parameter db_16k_cache_size NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_16k_cache_size big integer 4M
即使在这里指定1M了,但是系统还是使用了默认的最小值,取值的范围官方文档有说明:
Minimum: 0 (values greater than zero are automatically modified to be either the granule size * number of processor groups, or 4 MB * number of CPUs, whichever is greater)
Maximum: operating system-dependent
5. 创建16k的非标准块表空间
SQL> create tablespace TEST datafile '+DATA/ocm/datafile/test01.dbf' size 10M AUTOEXTEND on NEXT 10M MAXSIZE 100M blocksize 16k; 表空间已创建。
验证:如果创建未启用对应的Cache buffer会有什么结果,且创建和db_block_siez一样的值表空间。
SQL> create tablespace TEST04k datafile '+DATA/ocm/datafile/test021.dbf' size 10M AUTOEXTEND on NEXT 10M MAXSIZE 100M blocksize 4k; create tablespace TEST04k datafile '+DATA/ocm/datafile/test021.dbf' size 10M AUTOEXTEND on NEXT 10M MAXSIZE 100M blocksize 4k * 第 1 行出现错误: ORA-29339: 表空间块大小 4096 与配置的块大小不匹配 SQL> create tablespace TEST01 datafile '+DATA/ocm/datafile/test011.dbf' size 10M AUTOEXTEND on NEXT 10M MAXSIZE 100M blocksize 8k; 表空间已创建。
在创建非db_block_size 标准的表空间时,必须先设置对应的DB_nK_CACHE_SIZE 参数来创建nK 的buffer,不然会报:
ORA-29339: tablespace block size 4096 does not matchconfigured block sizes
使用和db_block_siez一样值来创建表空间也是可以的,其实就等于是默认参数。