oracle block
Oracle 数据块
Oracle管理数据库的数据文件的存储空间的分配单位称为数据块。数据块是数据库使用的最小单位。相对而言,在操作系统层面上,所有数据都保存为字节。每个操作系统都有一个块大小。Oracle访问数据是按Oracle数据块的倍数,而不是操作系统块的倍数。
设置规则如下:
参数名:db_block_size
类别:高速缓存和I/O
说明: 一个 Oracle 数据库块的大小 (字节)。该值在创建数据库时设置, 而且此后无法更改。
值范围: 1024 - 65536 (根据操作系统而定)。
默认值: 2048 (根据操作系统而定)
一般来说,我们建库时指定的db_block_size 都是使用默认的8k。 从这种角度来说,数据库的block size 都是一样的。 但Oracle 是可以配置Multiple Block Sizes的。
查阅有关资料,发现表空间数据文件容量与DB_BLOCK_SIZE有关,在初始建库时,DB_BLOCK_SIZE要根据实际需要,设置为4K,8K、16K、32K、64K等几种大小,ORACLE的物理文件最大只允许4194304个数据块(由操作系统决定),
表空间数据文件的最大值为 4194304×DB_BLOCK_SIZE/1024M。
即:
4k最大表空间为:16384M
8K最大表空间为:32768M
16k最大表空间为:65536M
32K最大表空间为:131072M
SQL> select * from v$version where rownum=1;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
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
SQL>
SQL> show parameter db_block
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_block_size integer 8192
SQL>
如果要配置Multiple Block Sizes,就需要配置db_nK_cache_size 参数,这些参数默认都是0. 配置完这些参数之后,我们在创建相关的表空间时,就可以指定对应的block。 这样就完成了Multiple Block Sizes。 但是,Multiple Block Sizes 给管理上代理一定的复杂度,所以实际使用的不多。
Note:
(1)32-bit operating systems support a maximum DB_BLOCK_SIZE value of16384(16k)--32位系统,db_block_size最大16k
(2)64-bit operating systems support a maximum DB_BLOCK_SIZE value of32768(32k)--64位系统,db_block_size最大32k
DB_nK_CACHE_SIZE 参数指定nK 的buffer,在指定cache时,要确保有足够的空间。 不能和DB_BLOCK_SIZE参数冲突,n 可以取2,4,8,16,32.
[root@node1 ~]# cat /proc/cpuinfo |grepflags |grep 'lm' |wc -l
0
结果大于0, 说明支持64bit计算. lm指long mode, 支持lm则是64bit。
SQL> alter system set db_32k_cache_size=1m scope=spfile;
alter system set db_32k_cache_size=1m scope=spfile
*
ERROR at line 1:
ORA-32017: failure in updating SPFILE
ORA-00382: 32768 not a valid block size, valid range [..]
SQL> alter system set db_16k_cache_size=1m scope=both;
System altered.
SQL> show parameter cache_size
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
client_result_cache_size big integer 0
db_16k_cache_size big integer 4M
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
-- 这个最小的默认值,上面的官网说明有解释:
--values greater thanzero are automatically modified to be either the granule size * number ofprocessor groups, or 4 MB * number of CPUs, whichever is greater
--指定了16kcache,我们就可以创建block 为16k的表空间了
SQL> create tablespace tt16k
datafile '/u01/oradata/db11/tt16k.dbf' size 50m
autoextend on next 10m maxsize 200m blocksize 16k;
Tablespace created.
--为了验证不指定cache报的错误,我们创建一个4k的tablespace
SQL> create tablespace tt4k
2 datafile '/u01/oradata/db11/tt4k.dbf' size 50m
3 autoextend on next 10m maxsize 200m blocksize 4k;
create tablespace tt4k
*
ERROR at line 1:
ORA-29339: tablespace block size 4096 does not match configured block sizes
SQL> create table tt16 tablespace tt16k as select * from dba_objects;
Table created.
SQL> select segment_name,blocks from dba_segments where segment_name='TT16';
SEGMENT_NAME BLOCKS
--------------------------------------------------------------------------------- ----------
TT16 576
--当表的每个block越大时,那么它里面就能够存放更多的block
--我们使用8k的block 来创建一个相同的表,来查看它使用blocks,从而进行对比
SQL> create table tt8 as select * from dba_objects;
Table created.
SQL> select segment_name,blocks from dba_segments where segment_name='TT8';
SEGMENT_NAME BLOCKS
--------------------------------------------------------------------------------- ----------
TT8 1152
--看到,使用16k是576个blocks,使用8k是1152个blocks。
-- 将tt8 table移到 tt16(16k)
SQL> alter table tt8 move tablespace tt16k;
Table altered.
SQL> select segment_name,blocks from dba_segments where segment_name='TT8';
SEGMENT_NAME BLOCKS
--------------------------------------------------------------------------------- ----------
TT8 576
看到了吗!!!! 1152----->576
由此可以看出,Oracle的目的很明显,在不同需求的时候,我们可以选择不Block大小的表空间,这样就可以解决由此带来的问题。