Oracle空间管理
1 Oracle Space Management
[本地管理(平衡二叉树)] | [字典管理]
2 逻辑和物理结构
Oracle Database Architecture
Data Blocks, Extents, and Segments
Part V Oracle Database Storage Structures
3 Tablespace
Temp
Sysaux
用户&表空间
smallfile VS bigfile
Managing Database Storage Structures
4 Segment
4.1 MSSM(Freelist)
①freelist:空闲列表中登记了可以插入数据的可用块,位置在段头,插入表行数据时首先查找该列表。
②pctfree:用来为一个块保留的空间百分比,以防止在今后的更新操作中增加一列或多列值的长度。达到该值,从 freelist 清除该块信息。
③pctused:一个块的使用水位的百分比,这个水位将使该块返回到可用列表中去等待更多的插入操作。达到该值,该块信息记录到 freelist。这个参数在 ASSM 下不使用。
ASSM 使用位图状态位取代了 pctused
4.2 ASSM(Bitmap)
5 Extent
5.1 Dictionary Manager 字典管理
5.2 Locl Manager 本地管理
5.2.1 uniform [size x] 统一区大小表空间
当段的大小超过64MB时,区大小为8MB。在使用统一区大小时,也可以将所有区都固定为8MB。
很多数据库都使用统一区大小,而且其大小为1MB。原因 操作系统中,一次I/O操作的最大的读、写数据量是1MB。即使使用8MB的区,一个区也必须分8次进行I/O操作,超过1MB的区大小,并不能减少I/O操作的次数。
但是,8MB的区连续的空间更多。读取8MB内的第1MB和第2MB数据虽然必须要分两次I/O操作,但这两次I/O操作很可能是连续I/O,因为第1MB和第2MB数据有可能是相连的。如果区大小仅为1MB,虽然读取表的第1区和第2区也是两次I/O操作,但这两次I/O操作很可能不相连,是随机I/O操作。连续I/O操作的性能当然比随机I/O操作的要高。因此,出于全表扫描性能的考虑,即使使用统一区大小,大点的区(如8MB大小)是很合适的选择。
5.2.2 autoallocate 系统管理区大小表空间
从空间的利用率上讲,小区节省空间,大区可能会浪费空间。比如,当区大小是10MB时,为一个表分配了一个10MB的区,哪怕它只使用了这10MB中的1个字节,这10MB空间也完全属于这个表了,其他表无法再使用这部分空间。从这个角度上讲,小区的空间利用率无疑是高的。但从性能角度上讲,对于随机访问,大区、小区没有影响。但对于全表扫描这样的操作,大区又是更合适的。因为连续空间更多,可以减少磁头在区间的定位。在系统管理区大小的方式下,当表比较小时,区也比较小,当表大时,区也随之变大,这种方式无疑可以在空间的利用率、全扫描的性能之间找到一种平衡。因此建议大多数情况下,都可以采用系统管理区大小的方式。除非有某个表,已明确地知道它会很大,为了保证全扫描的性能,直接建一个统一区大小,并且区比较大的表空间,以便将表存放其中。
6 Block
7 系统表
dba_tablespaces
col segment_space_management format a30
select tablespace_name, segment_space_management, extent_management, block_size/1024 from dba_tablespaces;
dba_segments
col segment_name format a40
select tablespace_name, segment_name, segment_type, extents, blocks from dba_segments;
select tablespace_name, distinct segment_type from dba_segments;
dba_extents
select tablespace_name, segment_name, extent_id, block_id from dba_extents;