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大小的表空间,这样就可以解决由此带来的问题。

 

 

 

 

 

 

 

 

 

 

 

 

posted on 2012-01-29 17:58  一路前行!!!  阅读(3249)  评论(0)    收藏  举报

导航