数据库结构(二).逻辑结构
一、数据库逻辑结构
<逻辑结构在Oracle体系中的位置>
逻辑结构层次:
数据库(DataBase)-->表空间(TableSpace)-->段(Segment)-->区间(Extent)-->数据块(Block)
1、表空间(TableSpace)
表空间是数据库中的基本逻辑结构,任何数据库对象在存储时都必须存储在某个表空间中。表空间对应于若干个磁盘文件,即表空间是由一个或多个磁盘文件构成的(物理上的一对多关系)。表空间相当于操作系统中的文件夹,也是数据库逻辑结构与物理文件之间的一个映射。每个数据库至少有一个表空间,表空间的大小等于所有从属于它的数据文件大小的总和。
Oracle10g一般包括以下空间:
select
*
from
dba_data_files;
select
*
from
v$tablespace;
select
*
from
dba_tablespaces;
(一)系统表空间(SYSTEM TableSpace)
SYSTEM是每个Oracle数据库都必须具备的。其功能是在系统表空间中存放诸如表空间名称、表空间所含数据文件等数据库管理所需的信息。系统表空间的名称是不可更改的。系统表空间必须在任何时候都可以用,也是数据库运行的必要条件。因此,系统表空间是不能脱机的。
系统表空间包括数据字典、存储过程、触发器和系统回滚段。为避免系统表空间产生存储碎片以及争用系统资源的问题,应创建一个独立的表空间用来单独存储用户数据。
(二)SYSAUX表空间(SYSAUX TableSpace)
SYSAUX是随着数据库的创建而创建的,它充当SYSTEM的辅助表空间,主要存储除数据字典以外的其他对象。SYSAUX也是许多Oracle 数据库的默认表空间,它减少了由数据库和DBA管理的表空间数量,降低了SYSTEM表空间的负荷。
(三)临时表空间(TEMP TableSpace)
相对于其他表空间而言,TEMP主要用于存储Oracle数据库运行期间所产生的临时数据(例如order by时)。数据库可以建立多个临时表空间。当数据库关闭后,临时表空间中所有数据将全部被清除。除临时表空间外,其他表空间都属于永久性表空间。
(四)撤销表空间(UNDOTBS1 TableSpace)
UNDOTBS1是用于保存Oracle数据库撤销信息,即保存用户回滚段的表空间。
另外10g在创建数据库的时候还会产生EXAMPLE和USERS表空间,用于存放系统实例和用户信息,但在实际的操作中一般会将EXAMPLE空间删去,并且尽量少使用USERS空间。在9i中还会生成另外一些如INDEX、CWMLITE、TOOLS等表空间,但在10g中已经整合到一起。
2、段(Segment)
段是对象在数据库中占用的空间,虽然段和数据库对象是一一对应的,但段是从数据库存储的角度来看的。一个段只能属于一个表空间,当然一个表空间可以有多个段。表空间和段是逻辑存储上的一对多的关系,段不直接和数据文件发生关系。一个段可以属于多个数据文件,关于段可以指定扩展到哪个数据文件上面。
select
*
from
dba_segments;
(一)数据段(Data Segment)
对于每一个非聚集的表有一数据段,表的所有数据存放在该段。每一聚集有一数据段,聚集中每一个表的数据存储在该段中。当创建一个表时,系统自动创建一个以该表的名字命名的数据段。
(二)索引段(Index Segment)
每一个索引有一个索引段,存储索引数据。一旦建立索引,系统自动创建一个以该索引的名字命名的索引段。
(三)回滚段(Rollback Segment)
由DBA建立,用于临时存储要撤销的信息,这些信息用于生成一致性数据库信息、在数据库恢复时使用,回滚未提交的事务。当一个事务开始处理时,系统为之分配回滚段,回滚段可以动态创建和撤销。系统有个默认的回滚段,其管理方式既可以是自动的,也可以是手工的。
(四)临时段(Temporary Segment)
当一个sql语句需要临时工作区时,由oracle建立。当语句执行完毕,临时段的范围退还给系统。
3、数据区间(Extent)
数据区间是一组连续的数据块。当一个表、回滚段或临时段创建或需要附加空间时,系统总是为之分配一个新的数据区,一个数据区不能跨越多个文件,因为它包含连续的数据块。在一个段中可以存在多个区间,区间是为数据一次性预留的一个较大的存储空间,直到那个区间被用满,数据库会继续申请一个新的预留存储空间,即新的区间,一直到段的最大区间数(Max Extent)或没有可用的磁盘空间可以申请。
使用区的目的是用来保存特定数据类型的数据,也是表中数据增长的基本单位。在Oracle数据库中,分配空间就是以数据区为单位的。理论上一个段是可以无穷个区间的,但是多个区间对ORACLE却是有性能影响的,ORACLE建议把数据分布在尽量少的区间上,以减少ORACLE的管理与磁头的移动,但是在某些特殊情况下,需要把一个段分布在多个数据文件或多个设备上,适当的加多区间数也是有很大好处的。
select
*
from
dba_extents;
4、数据块(Block)
块是Oracle最基本的存储单位,在建立数据库的时候指定,虽然在初始化文件中可见,但是不能修改。为了保证存取的速度,它是OS数据块的整数倍。ORACLE的操作都是以块为基本单位,一个区间可以包含多个块,如果区间大小不是块大小的整数倍,ORACLE实际也扩展到块的整数倍。
块的大小由初始参数DB_BLOCK_SIZE指定。(默认8K-8192)决定
数据块大小要考虑以下因素:
1.数据库环境类型。例如,是DSS环境还是OLTP环境?在数据仓库环境(OLAP或DSS)下,用户需要进行许多运行时间很长的查询,所以应当使用大的数据块。在OLTP系统中,用户处理大量的小型事务,采用较小数据块能够获得更好的效果。
2.SGA的大小。
块的内部结构与数据的存取方法都是比较复杂的,以表段的块为例,从简单的结构上划分,可以把块的内部划分成如下几个部分:公用头,表目录,行目录,可存取空间等。以下是一个表块的大致结构图:
(一)块头(BLOCK HEADER):包含着关于块类型(表块、索引块等等)的信息、关于块上活动和过时事务信息、磁盘上块的地址的信息。
(二)表目录(Table directory):如果给出的话,包含着此块中存储各行的表的信息(多个表的数据可能保存在同一个块中)。
(三)行目录(Row directory):包含在块中发现的描述行的信息(如地址等)。
注:以上3部分为块的开销(Block Overhead),剩余部分为可用存储空间。(一般的8K(8192)的块可用空间为8168)
(四)行数据:包括表或索引数据。一行可跨越多个数据块。
(五)空闲空间:分配空闲空间是用于插入新的行和需要额外空间的行更新。
PCTFREE:
表示保留该百分比的可用空间用于以后的行更新,避免行迁移。少于此百分比时,该块从FREE LIST上撤消下来,不再接收数据。如果pctfree设置得太高,则在全表扫描期间增加I/O,浪费磁盘空间;如果pctfree设置得太低,则会导致行迁移。
PCTUSED:
当数据块的使用空间低于pctused的值时,此数据块标志为空闲,该空闲空间仅用于插入新的行。如果数据块已经达到了由pctfree所确定的上边界时,Oracle就认为此数据块已经无法再插入新的行。如果pctused设置过高,则会降低磁盘的利用率导致行迁移;若pctused设置过低,则浪费磁盘空间,增加全表扫描时的I/O输出。
注:PCTFREE与PCTUSED默认分别是10与40,其配置与系统的优化有关,要慎重使用,PCTFREE+PCTUSED不要大于等于100,否则将导致块不断的在FREELIST移上移下,严重影响性能。若两者之和低于100,则空间的利用与系统的I/O之间的最佳平衡点是:pctfree与pctused之和等于100%减去一行的大小占块空间大小的百分比。例如,如果块大小为2048字节,则它需要100个字节的开销,而行大小是390字节(为可用块的20%)。为了充分利用空间,pctfree与pctused之和最好为80%。
二、关于逻辑结构的操作
1、查询表空间的文件的对应物理文件:
SQL> select * from dba_data_files;
2、查询表空间的空闲信息:
SQL> select * from dba_free_space;
3、将表空间设置为离线(offline)状态:
设置成离线的状态,则所有对该表空间内对象的修改将无法同步到数据文件中
SQL> alter tablespace *** offline;
4、限制某个用户能够使用的表空间的大小:
SQL>alter user *** quota ***M on ***
5、指定用户的临时表空间:
SQL>CREATE USER *** IDENTIFIED BY **** TEMPORARY TABLESPACE temp;
6、查询用户的区间信息:
SQL> select * from user_extents;
7、查询索引信息:
SQL> select * from user_indexes;
8、查看表空间的具体信息:
SQL> select * from dba_tablespaces;
BLOCK_SIZE :数据块的大小
INITIAL_EXTENT:初始化时分配的区的大小,其值为BLOCK_SIZE的整数倍
NEXT_EXTENT:当初始化时分配的区不够时,下一次扩展的区的大小
MIN_EXTENTS:区大小的下限
MAX_EXTENTS:区大小的上限
9、查看模式对象(Schema Object):
SQL> select * from dba_source;
Oracle模式对象包括了表、索引、约束、过程、函数、触发器等等应用结构。
10、与表空间有关的数据字典汇总:
dba_tablespaces----------------TableSpace表
dba_users----------------------User表
dba_ts_quotas------------------TableSpace配额表
dba_data_files-----------------TableSpace对应File表,描述了全部数据文件的名称、文件标识、大小、对应的表空间信息
dba_extents--------------------Extent表
dba_free_space-----------------TableSpace剩余空间表
dba_segments-------------------Segment表
dba_temp_files-----------------dba_data_files子表
dba_undo_extents---------------dba_extents子表
dba_rollback_segs--------------dba_segments子表
v$backup_datafile--------------此视图通常用来获取每个数据文件中非空白数据块的数量,从而帮助你创建出大小基本相等的备份集。
v$database_block_corruption----查询坏块的视图
v$datafile---------------------描述了数据文件的同步信息
v$datafile_copy----------------包含控制文件中数据库文件副本的信息。
v$datafile_header--------------显示数据文件头部的数据文件信息
v$rollstat---------------------本视图自启动即保持并记录各回滚段统计项。
v$segment_statistics-----------实时监测段级(segment-level)统计项
v$undostat---------------------本视图监控当前实例中undo 空间以及事务如何运行
11、创建一个表空间:
SQL> create tablespace *** nologging
2 datafile 'D:\oracle\product\10.2.0\oradata\***\***01.ora' size 50m blocksize 8192
3 extent management local uniform size 256k
4 segment space management auto;
SQL> create temporary tablespace temp
2 tempfile 'D:\ oracle\product\10.2.0\oradata\***\temp01.ora'
3 size 500m autoextend off
4 extent management local uniform size 512k;
12、表空间的读写控制:
SQL>alter tablespace *** read only;
SQL>alter tablespace *** read write;
13、删除表空间:
SQL>drop tablespace *** including contents and datafiles;
包含空间内的目录内容和数据文件
14、表空间改名:
SQL>alter tablespace users rename to newusers;
15、表空间组:
(一)在Oracle 10g中增加了一个表空间组的概念,通过使用表空间组用户可以使用一个以上的表空间存储临时段。表空间组是在第一个表空间被指定给该组时,由系统自动隐式创建的。例如:
SQL> alter tablespace temp tablespace group temp_ts_group;
(二)添加一个新表空间到该表空间组:
SQL> create temporary tablespace temp2
2 tempfile 'D:\oracle\product\10.2.0\oradata\test\temp201.dbf ' size 20m
3 tablespace group temp_ts_group;
(三)可通过以下SQL查找表空间组的情况:
SQL> select * from dba_tablespace_groups;
(四)将整个表空间组给用户作为临时表空间:
SQL> alter user scott temporary tablespace temp_ts_group;
SQL> alter database default temporary tablespace temp_ts_group; --设置成默认
(五)将表空间移出表空间组:
SQL> alter tablespace temp2 tablespace group; --后面不写
16、表空间相关查询:
(一)查询数据文件,表空间名以及大小
select
file_name,tablespace_name,round(bytes/
1024000
) MB
from
dba_data_files
order
by
file_name;
(二)查询表空间、表空间的文件、分配的空间、空闲空间以及下一个空闲分区
select
ddf.tablespace_name tablespace_name,ddf.file_name file_name,ddf.bytes/
1024
tablespace_kb,
sum
(fs.bytes)/
1024
kbytes_free,
max
(fs.bytes)/
1024
next_free
from
sys.dba_free_space fs,sys.dba_data_files ddf
where
ddf.tablespace_name=fs.tablespace_name
group
by
ddf.tablespace_name,ddf.file_name,ddf.bytes/
1024
order
by
ddf.tablespace_name,ddf.file_name;
(三)表空间数据文件的实际大小(与磁盘中大小不同)
select
substr(df.file_name,
1
,
70
) filename,
max
(de.block_id*
(de.bytes/de.blocks)+de.bytes)/
1024
min_size
from
dba_extents de,dba_data_files df
where
de.file_id=df.file_id
group
by
df.file_name;