《你知道Oracle的数据文件大小有上限么?》这篇文章中有朋友说"能否写一篇添加数据文件时如何指定数据块大小的",其实这个操作,是Oracle OCM认证考试中某个场景的考题。

这是《Concept》中关于逻辑和物理存储结构的一张经典图,数据块是最小的I/O存储和处理单元,逻辑结构中,从数据块(Block)往上,就是区(Extent)、段(Segment)和表空间(Tablespace)。物理结构中,操作系统块,可以说起到了衔接的作用,一个Oracle数据块(例如8k)可以包含多个OS块(例如2k),一个数据文件则包含了多个OS块。同样起到衔接作用的,还有表空间,一个表空间可以包含多个数据文件。通过这种设计,达到了Oracle数据库存储数据的目的和保障。

非标准数据块的表空间使用_python

从Oracle 9i开始,同一个数据库可以有多个不同数据块大小,每个不同的数据块都必需有其自己的缓冲区缓存。当数据库使用非标准块表空间时,db_nk_cache_size参数将会派上用场,不同块尺寸的数据缓冲区的大小就由相应参数db_nk_cache_size来指定,其中n可以是2、4、8、16或32。例如须创建一个大小为2k的非标准尺寸的表空间,则须先指定db_2k_cache_size为这个表空间指定缓存区的大小。但是,db_nk_cache_size不能设置默认标准块大小的缓冲区,例如默认块大小为8k,则不能设置参数db_8k_cache_size,因为这个是用来设置非标准块的。

如文章所说,Oracle默认数据块是8k,在数据库创建时指定的,如果此时要创建一个非标准数据块的表空间,需要设置db_nk_cache_size参数,如果是19c以上的CDB数据库,该参数需要在CDB中进行改动,PDB中改动,会提示错误,如下所示,

非标准数据块的表空间使用_python_02

登录到CDB,可以看到db_32k_cache_size是0,

非标准数据块的表空间使用_python_03

设置32k的参数,查询是生效的,

非标准数据块的表空间使用_数据库_04

关于此处cache可以设置的最小值,官方文档描述,

values greater thanzero are automatically modified to be either the granule size * number ofprocessor groups, or 4 MB * number of CPUs, whichever is greater

登录PDB,创建32k表空间,

非标准数据块的表空间使用_oracle_05

可以看到,已经创建了一个32k的表空间,

非标准数据块的表空间使用_java_06

为了更直观说明,我们在默认8k数据块的表空间中创建一张表,其占据的数据块个数是256,

非标准数据块的表空间使用_java_07

将其移动至32k数据块的表空间,占据的数据块个数是64,同一个数据块中存储的数据多了,需要的数据块个数就少了,

非标准数据块的表空间使用_数据库_08

可以看出,Oracle在数据块粒度的设计上,还是有所考虑的。