表空间是什么?表空间是数据库的一种逻辑结构,它在物理上对应着一个或多个数据文件。平常所讲的表空间管理实际上指的是对表空间所对应的数据文件的空间管理。
Oracle支持两种管理方式,一种是字典管理(简称DMT),一种是本地管理(简称LMT)。这里所说的管理方式是指针对extent的管理方式。extent也是数据库的一种逻辑结构,它包含一定数量的、连续的Oracle块。它是Oracle的空间分配的最小单位。针对它的管理方式就是指表空间中的extent是如何被管理的(记录extent的free、used使用情况)。
在这两种管理方式中,字典管理方式是Oracle遗留的一种空间管理方式,它采用数据字典表UET$、FET$来记录表空间中extent的使用情况。
每次进行涉及空间管理的操作时,都必须对这两个表进行维护,其影响是显而易见的。当并发提高时,该表上的争用将无法避免被提高,同时将产生大量的undo占用大量系统回滚段,而且在字典管理方式下将产生令人头痛的碎片问题。
本地管理方式是从Oracle 8i开始支持的一种管理方式,也是目前Oracle强烈建议采用的一种方式。它不再利用数据字典表来记录空间使用情况,取而代之的是在数据文件头部增加一个位图区,用位图来记录空间的使用情况,每一个bit都代表着一个extent的使用情况。
数据库中如果不存在dmt类型的表空间,则UET$和FET$中不再有信息。
表空间本身是和SQL语句运行效率相关的,主要包括以下几个方面:
对于DML语句来说,如果涉及空间的扩展,需要有个分配的过程此时,给用户的体验就是SQL执行速度很慢。
从Oracle 10g开始,引入了一个等待事件“data fileinit write”来表示表空间扩展时发生的等待。为Oracle需要将系统块格式化为Oracle数据块,然后才能提供数据库使用。常见的优化策略是在大规模的DML操作之前提前预分配空间的,这样可避免临时的空间扩展导致的效率低下。
对于排序等操作,如果空间消耗较大,需要用到TEMP表空间。如果TEMP空间不足,会导致SQL语句执行失败。因此,对于TEMP表空间的使用要进行监控,对于耗费TEMP较大的SQL需要重点关注,并进行重点优化。