Oracle的存储结构
在ORACLE数据库中对于数据存储的管理可以从两方面来论述。从逻辑上来说,ORACLE是将数据存储在表空间中的表里面,从物理上来说,ORACLE是将数据存储在磁盘的数据文件里。具体的结构如下图所示:
一个ORACLE数据库可以包含多个TABLESAPCE;一个表空间物理上可以包含多个DATAFILE,逻辑上可以包括多个SEGMENT(TABLE、INDEX等);一个SEGMENT可以包含多个EXTENT并且可以跨数据文件存储数据;一个EXTENT包含多个DATA –BLOCK,其不可以跨数据文件存储;一个DATA-BLOCK包含多个OS-BLOCK。
TABLESPACE的管理
TABLESPACE的管理可以分为两种管理方式:DATA-DICTIONARY MANAGEMENT和LOCAL MANAGEMENT。首先必须说明的是:对于在表空间上的说的管理方式是针对表空间里EXTENT的管理,即如何分配和回收EXTENT。在这两种管理方式中前者基本上已经被淘汰了,DATA-DICTIONARY MANAGEMENT 就是用两个数据字典(DEBIT、CREDIT)来管理哪些EXTENT已经被分配了哪些EXTENT还没有被分配,这种管理方式的缺点就是每分配和回收EXTENT时都需要去查询和更新这个两数据字典,这样就消耗了大量的系统资源,对PERFORMANCE上有很大的影响。对于LOCAL MANAGEMENT这种管理方式,ORACLE是在第一个数据文件的头部存储了一个BITMAP(010100111011001100010001110),当一个EXTENT被分配给了某个SEGMENT时只需要将1改为0即可,这对PERFORMANCE有很大的提高。具体的指令如下:
CTEATE TABLESPACE tab_sapce DATAFILE ‘C:/oracle/product/10.1.0/oradata/orcl/datafile/tab_sapce.dbf’ SIZE 100M EXTENT MANAGEMENT LOCAL UNIFORM SIZE 128k
这里需要指出的是对于LOCAL MANAGEMENT的管理方式还可指定分配的EXTENT为统一的大小(UNIFORM SIZE 128k)。
前面讲了TABLESPACE的管理方式,现在现在再讲一下TABLESPACE的空间扩展方法。这里有三种方法:
1. 向TABLESPACE中再添加一个DATAFILE
ALTER TABLESATPCE tab_sapce ADD DATAFILE ‘C:/oracle/product/10.1.0/oradata/orcl/datafile/tab_sapce01.dbf’ SIZE 100M
2. 重置一个DATAFILE的大小
ALTER DATABASE DATAFILE ‘C:/oracle/product/10.1.0/oradata/orcl/datafile/tab_sapce.dbf’ RESIZE 100M
3. 改变DATAFILE的增涨方式为 AUTOEXTEND ON NEXT….MAXSIZE….
ALTER DATABASE DATAFILE ‘C:/oracle/product/10.1.0/oradata/orcl/datafile/tab_sapce.dbf’ AUTOEXTEND ON NEXT 10M MAXSIZE 100M
顺便提出一下查询表空间、数据文件的几个常用数据字典和动态性能视图:
DBA_TABLESPACES,USER_TABLESPACES,DBA_DATA_FILE,DBA_FREE_SPACE,DBA_SEGMENTS
USER_SEGMENTS,V$TABLESPACE,V$DATAFILE,V$TMPFILE
SEGMENT的管理
一个SEGMENT包含多个EXTENT,一个EXTENT包含多个BLOCK。对于SEGMENT的管理则是指对SEGMJENT中BLOCK的管理,其分为:MANUAL MANAGEMENT和AUTOMATIC SEGENT-SPACE MANAGEMENT。对于BLOCK的管理有几个参数需要了解:
PCTFREE:这个参数用于指定一个BLOCK中需要为以后BLOCK中数据的更改欲留的空间(百分比),即当BLOCK中的剩余空间小于等于这个值时这个BLOCK就不能再插入数据了,将被标记为不可用状态。
PCTUSED:当一个BLOCK中的空间因为数据的更新或插入而减小到这个值时这个BLOCK将会被标记为可用状态。
ININTRANS:初始并发事务处理数量
MAXTRANX:最大并发事务处理数量
手动管理:在SEGMENT中指定一个或多个FREELIST用来管理SEGMENT中的BLOCK
自动管理:在SEGMENT中指定几个连续的BLOCK
所谓MANUAL MANAGEMENT就是在SEGMENT中构建一个FREELIST用于管理BLOCK的分配,这种方式现在已基本不使用。
对于AUTOMATIC SEGENT-SPACE MANAGEMENT方式就是在每个SEGMENT中取几个连续的BLOCK(BITMAP BLOCKS简称DMBS)来存放一个BITMAP,用于管理BLOCK。
具体指定管理方式的指令如下:
‘C:/oracle/product/10.1.0/oradata/orcl/datafile/tab_sapce.dbf’ SIZE 100M EXTENT MANAGEMENT LOCAL UNIFORM SIZE 128k SEGMENT SPACE MANAGEMENT AUTO
注:这是在创建表空间进指定的,并不是在创建SEGMENT时指定的,我在初学这个时经常搞错。对于INITTRANS,MAXTRANS,PCRFREE,PCRUSED,FREELIST这些参数是在创建表的时候指定。
在ORACLE中的BOLCK的大小有标准和非标准这分,对于标准的BLOCK一般有参数DB_BLOCK_SIZE决定,一般为8K,在系统中SYSTEM和TEMPORARY表空间只能使用标准的数据BLOCK。此外非标准的BLOCK又分为:2K,4K,16K,32K。一般由参数DB_Nk_CACHE_SIZE决定,在创建表空间时可以指定BLOCK的大小。
这里还介绍两个常见的TERMINOLOGY
BLOCK MIGTATION:指的是当一个BLOCK的空间因为数据的更新的出现不够的情况时,ORACLE就会把这个数据迁移到另一个BLOCK并在该块留下一个指针指向那个 新的BLOCK。
BLOCK CHAINNING:指的是当一条数据因为过大使一个BLOCK无法全部装下时,ORACLE就是把这条数据分成几个PIECE存储到不同的数据BLOCK中并在各个块中留下相应的指针。
以上这两种情况在数据的操作时都要一次操作几个BLOCK,所以对性能影响很大。
TABLE的管理
TABLE的管理并没有多少值得说的,主要就是对表的存储结构的管理(对一些参数的设置),而对于其数据的完整性的管理这里不再阐述。ORACLE中对表的存储结构上主要涉及到以下几个参数:
INITTRANS,MAXTRANS,PCFFREE,PCTUSED,INITIAL,NEXT,PCTINCREASE,MINEXTENTS,MAXEXTENTS(这当中也有一些现在不使用了)
对于以上这些参数,在表一级设置会受到表空间一级的参数的影响。比如说在表空间一级设置了UNIFORM SIZE 128K(统一大小),当我们在表一级再设置INITIAL,NEXT,PCTINCREASE这几个参数就会失效。
手动为表分配空间实现表跨数据文件
ALTER TABEL table_name ALLOCATE EXTENT (SIZE 10M DATAFILE ‘***’);
回收没有被使用的空间
ALTER TABLE table_name DEALLOCATE UNUSED;
更新表的STATISTICS
EXEC DBMS_STATS.GATHER_TABLE_STATS(‘username’,’tablename’)
在表的管理中还涉及一些表名的更改,列名的更改等操作,这些这里都不再讲述。
INDEX的管理
对于INDEX的管理,这里主要讲述一上对INDEX的监控管理即分析INDEX,监控INDEX的使用情况等。查询系统有那些INDE命令如下:
SELECT * FROM DBA_OBJECTS/USER_OBJECTS
首先是对INDEX的分析,在此主要是讲一下对INDEX的结构的分析(层级,节点数等)。命令语如下:
ANALYZE INDEX index_name VALIDATE STRUCTURE
DBMS_STATS.GATHER_INDEX_STATS(‘username’,’indexname’)
分析之后可以在V$INDEX_STATS中查询到分析的结果。
其次是重构INDEX和溶合INDEX。在ORCLE的运行期间可能全对INDEX中的内容进行修改,当修改数据累积到一定的值时INDEX中就会出现大量的空间冗余(因为当我们删除索引值时,在INDEX中并没有真的删除相应的记录,只是将其标注为删除状态,如果这些记录以后不会被重用,这些空间将被浪费),因此重构或者溶合这些空间对提高INDEX的访问速度和系统的整体性能都有极大的帮助。具体命令如下:
重构:ALTER INDEX indexname REBUILD TABLESPACE tsname
注:在进行INDEX的重构时应该注意,因为对INDEX的重构时先复制一个一模一样的INDEX再将老的INDEX删掉,所以这里就要求要就足够的空间来容纳两个INDEX。另外,这种重构INDEX时会锁住INDEX对应的TABLE
在线重构:ALTER INDEX indexname REBUILD ONLINE
这种重构INDEX的方式也会锁住表,只是锁表的时间要短一些
溶合INDEX:ALTER INDEX indexname COALESCE
所谓溶全INDEX就是将INDEX中一些相邻的小的的空间重新组织成一个大的空间(BLOCK)
监控INDEXR的使用:这里我们可能监控一个INDEX在一定的时间内的使用情况
ALTER INDEX indexname MONITORING USAGE
ALTER INDEX indexname MONITORING USAGE
监控后可以在v$object_usage中查看其使用情况
常用查询INDEX的数据字典:DBA_INDEXS DBA_IND_COLUMNS
另外,我们在创建INDEX也可以指定在创建表时可用的存储参数,手动分配空间实现跨数据文件和回收空间等。
UNDO的管理
UNDO TABLESPACE的管理也有两种管理方式:AUTOMATIC UNDO MANAGEMENT和MANUAL UNDO MANAGEMENT
UNDO TABLESPACE 主要是用于TRANSACTION ROOLBACK、TRANSACTION RECOVERY、READ CONSISTENCY,当我对某条数据作了修改后,如果没有COMMIT,ORACLE会将修改这前的数据放到UNDO TABLESPACE中去,它是通过一种循环写的方式来管理其空间的,对于每条UNDO数据在UNDO TABLESAPCE中的存放时间可以通一个INIT PARAMETER来指定(UNDO_RETENTION),至于我们在读取数据时是如何读取一条记录它在UNOD TABLESPZCEJFD 里面对应的记录的,在ORACLE中有一个SCN(SYSTEM CHANGE NUMBER)来标识一个记录在修改前和修改后(NO COMMIT)的对应关系的
在初始化参数中可以通过UNDO _MANAGEMENT和UNDO_TABLESPACE指定系统的UNDO管理方式和DEFAULT UNDO TABLESPACE
待更新.......
第一次写...多多指教...