Decode360's Blog

业精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

  BlogJava :: 首页 :: 新随笔 :: 联系 ::  :: 管理 ::
  302 随笔 :: 26 文章 :: 82 评论 :: 0 Trackbacks
一、数据库逻辑结构
 
 
 
               逻辑结构在Oracle体系中的位置
 
 
逻辑结构层次:
数据库(DataBase-->表空间(TableSpace)-->段(Segment)-->区间(Extent)-->数据块(Block)
 
 
表空间(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中已经整合到一起。

段(Segment)
    段是对象在数据库中占用的空间,虽然段和数据库对象是一一对应的,但段是从数据库存储的角度来看的。一个段只能属于一个表空间,当然一个表空间可以有多个段。 表空间和段是逻辑存储上的一对多的关系,段不直接和数据文件发生关系。一个段可以属于多个数据文件,关于段可以指定扩展到哪个数据文件上面。

    select * from dba_segments;

 
(一)数据段(Data Segment)
    对于每一个非聚集的表有一数据段,表的所有数据存放在该段。每一聚集有一数据段,聚集中每一个表的数据存储在该段中。当创建一个表时,系统自动创建一个以该表的名字命名的数据段。
 
(二)索引段(Index Segment)
    每一个索引有一个索引段,存储索引数据。一旦建立索引,系统自动创建一个以该索引的名字命名的索引段。
 
(三)回滚段(Rollback Segment)
    由DBA建立,用于临时存储要撤销的信息,这些信息用于生成一致性数据库信息、在数据库恢复时使用,回滚未提交的事务。当一个事务开始处理时,系统为之分配回滚段,回滚段可以动态创建和撤销。系统有个默认的回滚段,其管理方式既可以是自动的,也可以是手工的。
 
(四)临时段(Temporary Segment)
    当一个sql语句需要临时工作区时,由oracle建立。当语句执行完毕,临时段的范围退还给系统。
 
 
 
数据区间(Extent)
 
    数据区间是一组连续的数据块。当一个表、回滚段或临时段创建或需要附加空间时,系统总是为之分配一个新的数据区,一个数据区不能跨越多个文件,因为它包含连续的数据块在一个段中可以存在多个区间,区间是为数据一次性预留的一个较大的存储空间,直到那个区间被用满,数据库会继续申请一个新的预留存储空间,即新的区间,一直到段的最大区间数(Max Extent)或没有可用的磁盘空间可以申请。
    使用区的目的是用来保存特定数据类型的数据,也是表中数据增长的基本单位。在Oracle数据库中,分配空间就是以数据区为单位的。理论上一个段是可以无穷个区间的,但是多个区间对ORACLE却是有性能影响的,ORACLE建议把数据分布在尽量少的区间上,以减少ORACLE的管理与磁头的移动,但是在某些特殊情况下,需要把一个段分布在多个数据文件或多个设备上,适当的加多区间数也是有很大好处的。

    select * from dba_extents;

 
 
数据块(Block)
 
    块是Oracle最基本的存储单位,在建立数据库的时候指定,虽然在初始化文件中可见,但是不能修改。为了保证存取的速度,它是OS数据块的整数倍。ORACLE的操作都是以块为基本单位,一个区间可以包含多个块,如果区间大小不是块大小的整数倍,ORACLE实际也扩展到块的整数倍。
 
    块的大小由初始参数DB_BLOCK_SIZE指定。(默认8K-8192)决定 数据块大小要考虑以下因素:
    一是数据库环境类型。例如,是DSS环境还是OLTP环境?在数据仓库环境(OLAP或DSS)下,用户需要进行许多运行时间很长的查询,所以应当使用大的数据块。在OLTP系统中,用户处理大量的小型事务,采用较小数据块能够获得更好的效果。
    二是SGA的大小。
 
    块的内部结构与数据的存取方法都是比较复杂的,以表段的块为例,从简单的结构上划分,可以把块的内部划分成如下几个部分:公用头,表目录,行目录,可存取空间等。 以下是一个表块的大致结构图:
            11.png
 
(一)块头(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;

 




-The End-

posted on 2008-08-19 22:12 decode360-3 阅读(347) 评论(0)  编辑  收藏 所属分类: Oracle

只有注册用户登录后才能发表评论。


网站导航: