众所周知,db_block_size在建库后并不能修改,但是我们面对一些特殊需求的时候,总是想把db_block_size调大一点或者调小一点。我们可以通过db_nk_cache_size去实现我们这些需求。


SQL> show parameter cache_size;


NAME                                  TYPE         VALUE

------------------------------------ ----------- ------------------------------

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_keep_cache_size                    big integer 0

db_recycle_cache_size                 big integer 0


SQL> alter system set db_16k_cache_size=1m;


System altered


SQL> show parameter cache_size;


NAME                                  TYPE VALUE

------------------------------------ ----------- ------------------------------

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_keep_cache_size                    big integer 0

db_recycle_cache_size                 big integer 0


SQL> show parameter cpu;


NAME                                   TYPE         VALUE

------------------------------------ ----------- ------------------------------

cpu_count                              integer        1

parallel_threads_per_cpu               integer        2


SQL> select t.NAME,t.BYTES/1024/1024 as "size(M)" from v$sgainfo t where t.name='Granule Size';


NAME                               size(M)

-------------------------------- ----------

Granule Size                           4


SQL> create tablespace cache_size datafile 'cache_size_001.dbf' size 16M BLOCKSIZE 16K;


Tablespace created.


SQL> select t1.FILE_NAME,t1.USER_BYTES/t1.USER_BLOCKS/1024 as "per_block_size(K)" from dba_data_files t1

where t1.TABLESPACE_NAME in (upper('users'),upper('cache_size'));


FILE_NAME                                                          per_block_size(K)

------------------------------------------------------------------ -----------------

/u01/app/oracle/oradata/xiaoyao/dfile/users01.dbf                    8

/u01/app/oracle/product/10.2.0/dbhome_1/dbs/cache_size_001.dbf       16


SQL> create table tmp_test (id int,image clob) tablespace cache_size;


Table created


SQL> create table tmp_czx (id int,image clob);


Table created


SQL> select distinct(t.segment_name),

t.BYTES/t.BLOCKS/1024 as "per_block_size(K)"

from dba_extents t

where t.segment_name in ('TMP_TEST','TMP_CZX') and t.owner=upper('system');


SEGMENT_NAME                      per_block_size(K)

------------------               -----------------

TMP_TEST                           16

TMP_CZX                             8



SQL> alter system set db_16k_cache_size=0;


System altered


SQL> show parameter cache_size;


NAME                                  TYPE VALUE

------------------------------------ ----------- ------------------------------

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_keep_cache_size                    big integer 0

db_recycle_cache_size                 big integer 0


SQL> alter system set db_16k_cache_size=0;


System altered


insert into tmp_test(id) values(1);


SQL> insert into tmp_test(id) values(1);


insert into tmp_test(id) values(1)


ORA-00379: no free buffers available in buffer pool DEFAULT for block size 16K


SQL> alter system set db_16k_cache_size=1m;


System altered


SQL> show parameter cache_size;


NAME                                  TYPE VALUE

------------------------------------ ----------- ------------------------------

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_keep_cache_size                    big integer 0

db_recycle_cache_size                 big integer 0


SQL> insert into tmp_test(id) values(1);


1 row inserted


SQL> commit;


Commit complete


SQL> show parameter db_block


NAME                                  TYPE VALUE

------------------------------------ ----------- ------------------------------

db_block_buffers                       integer 0

db_block_checking                      string FALSE

db_block_checksum                      string TRUE

db_block_size                          integer 8192


SQL> alter system set db_8k_cache_size=1m;


alter system set db_8k_cache_size=1m


ORA-32017: failure in updating SPFILE

ORA-00380: cannot specify db_8k_cache_size since 8K is the standard block size


SQL> show parameter sga


NAME                                 TYPE VALUE

------------------------------------ ----------- ------------------------------

lock_sga                             boolean FALSE

pre_page_sga                         boolean FALSE

sga_max_size                         big integer 300M

sga_target                           big integer 300M


SQL> alter system set db_16k_cache_size=136m;


System altered


SQL> alter system set db_16k_cache_size=140m;


alter system set db_16k_cache_size=140m


ORA-02097: parameter cannot be modified because specified value is invalid

ORA-00384: Insufficient memory to grow cache




SQL> alter system set db_16k_cache_size=7m;


System altered


SQL> show parameter cache_size;


NAME                                  TYPE VALUE

------------------------------------ ----------- ------------------------------

db_16k_cache_size                     big integer 8M

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_keep_cache_size big integer 0

db_recycle_cache_size big integer 0


ps:

db_nk_cache_size其实就是设置一个处理一些特殊block size的表空间。如果这个值为0,那么就无法使用这些表空间了。