表空间基本概念
数据库的运行需要依赖于操作系统,而数据库本身也保存在操作系统的磁盘上,所以当用户向数据表中保存数据时,最终数据是被保存在了磁盘上,只是这些数据是按照固定的格式进行保存,就像这样:
通过上图可发现,在数据库数据和磁盘数据之间存在下面两种结构:
逻辑结构:Oracle中所引入的结构,开发人员所操作的都只针对Oracle的逻辑
物理结构:操作系统所拥有的存储结构,逻辑结构到物理结构的转换由Oracle数据库管理系统来完成;
Oracle引入两个操作结构的目的:
系统数据库具有很强的可移植性,即只要数据文件按照规定的标准进行数据的存储,那不同的厂商就可以定义属于自己的逻辑结构,实现逻辑结构的关键就是表空间;
表空间是Oracle最大的逻辑结构,每一个Oracle数据库都会由若干表空间组成,每个表空间由多个数据文件组成。
用户创建的表也统一被表空间管理;
表空间与磁盘上的数据文件对应,所以直接与物理存储结构关联;
用户在数据库中创建的数据表,索引,视图,子程序等,都被表空间保存到了不同的区域内;
数据库,表空间,表的理解:可见整个数据库理解为图书馆,每一个表空间相当于书架,每张表相当于书架上的书。为了方便用户查阅,图书的分类依靠书架上的标签(表受表空间管理),而书架必须放在图书馆(表空间受到数据库管理)里;
表空间分类
系统表空间:是在数据库创建时与数据库一起建立起来的,例如用户用于撤销的事务处理,或者使用的数据字典就保存在系统表空间中,例如system或sysaux表空间;
非系统表空间:由具备指定管理员权限的数据库用户创建,主要用于保存用户数据,索引等数据库对象,例如USERS,TEMP,UNDOTBSI等表空间;
实际上,一般用户使用的都是非系统表空间;
创建表空间
定义非系统表空间的基本语法:
create [TEMPORARY] tablespace 表空间名称 [DATAFILE | TEMPFILE 表空间文件保存路径 ....] [SIZE 数字[K|M]] [AUTOEXTEND ON|OFF] [NEXT 数字 [K|M]] [LOGGING | NOLOGGING];本语法各个创建子句的相关说明:
- datafile:保存表空间的磁盘路径,可以设置多个保存路径;
- tempfile:保存临时表空间的磁盘路径;
- size:开辟的空间大小,其单位有K(字节)和M(兆);
- autoextend:是否为自动扩展表空间,如果为ON表示可以自动扩展表空间大小,反之为OFF;
- next:可以定义表空间的增长量;
- logging|nologging:是否需要对DML进行日志记录,记录下的日志可以用于数据恢复;
永久性表空间是为了保存用户的对象数据,例如,当使用create语句创建对象,或者使用insert语句进行数据保存,实际上这些信息都保存在了永存表空间中。
临时表空间的是用于排序操作使用,如果用户在sql中order by或group by子句时,Oracle需要对所选的数据进行排序,如果排序量较大,就需要把一些中间的排序结果保存在磁盘上,即保存在临时表空间中;
示例:创建一个mldn_data的数据表空间:此实例可使用sys账号来做,使用其它账号可能会出现权限不足的问题;
CREATE TABLESPACE mldn_data DATAFILE 'd:\mldnds\mldn_data01.dbf' SIZE 50M , 'e:\mldnds\mldn_data02.dbf' SIZE 50M AUTOEXTEND on NEXT 2M LOGGING ;此sql会创建一个mldndata的数据表空间,而此表空间对应两个数据文件,data01,data02。同时这两个数据文件的初始化大小均为50m。当空间不足时,可以自动进行容量的扩容,每次扩充2M大小;注意:此sql不会自动创建跟目录,要人工手动创建;示例2:创建一个mldn_temp的临时表空间,创建临时表空间的关键字是tempfile
CREATETEMPORARY TABLESPACE mldn_temp TEMPFILE'd:\mldnds\mldn_temp01.dbf' SIZE 50M , 'e:\mldnds\mldn_temp02.dbf' SIZE 50M AUTOEXTENDon NEXT 2M ;示例3:创建完表空间后,可以利用dba_tablespaces这个数据字典查看表空间信息
利用dba_tablespaces查看表空间信息SELECTtablespace_name,block_size,extent_management,status,contents FROMdba_tablespaces ;通过此数据字典的查询结果可以发现,此表空间为本地磁盘管理(LOCAL),mldn_data表空间为永久表空间(permanent),而mldn_temp为临时表空间;
示例4:利用dba_temp_files数据字典查看数据文件信息
SELECTtablespace_name,file_name,bytes,autoextensible FROM dba_temp_files ;示例5:利用dba_data_files数据字典查看数据文件信息
SELECTtablespace_name,file_name,bytes,autoextensible,online_status FROMdba_data_files ;
使用表空间
用户在默认情况下所创建的数据表都会保存在默认表空间中(可由用户定义,默认为users表空间)。如果需要将数据表保存在不同的表空间下,可使用如下的语法:
语法:创建数据表并使用特定表空间
create table 用户名.表名称( 字段名称 字段类型 default 默认值, 字段名称 字段类型 default 默认值, .... ) tablespace 表空间名称;示例1:用户在定义表时直接使用tablespace就可以指定要操作的表空间
创建数据表,指定表空间,此sql执行完毕之后,创建mytab会保存在mldn_data表空间中保存;CREATE TABLE mytab( id NUMBER , title VARCHAR2(50) ) TABLESPACE mldn_data ;
附录:Oracle中的默认表空间
Oracle默认提供的表空间,作用如下:
system表空间:在一个数据库中至少有一个表空间,即system表空间,创建数据库时必须指明表空间数据文件的特征,如数据文件名称,大小,system主要是存储数据库的数据字典,在Oracle系统表空间中存储全部的PL/SQL程序的源代码和编译后的代码。例如存储过程,函数,包,数据库触发器。如果要大量PL/SQL,就应该设置足够大的system表空间;
sysaux表空间:是system表空间的辅助表空间,许多数据库的工具和可选组件将其对象存储sysaux表空间内,它是许多数据库工具和可选组件的默认表空间;
users表空间:用于存储用户的数据;
undo表空间(undotbsi)表空间:用于事务的回滚,撤销;
temp临时表空间:用于存放Oracle运行中需要临时存放的数据,如排序的中间结果等;