Oracle表空间是Oracle数据对象和数据存储的容器,Oracle表空间经常和数据文件成对出现,一个表空间可以对应多个数据文件,而一个数据文件只能在一个表空间当中。我们在创建表空间时,就会默认创建一个数据文件,同理,我们创建数据文件时,必须指定一个表空间。
一、概述
Oracle数据库存储数据是有一个个表空间组成的,一个表空间当中存储着多个数据文件,Oracle的数据(表、索引等数据)存储在数据文件当中,在表空间当中的逻辑单位是段(segment),例如:
我们创建一个索引时,会在指定表空间的创建一个以索引名字命名的索引段,然后在索引段当中创建一个或者多个区(extent),用来存储索引数据,一个区段只能存在于一个数据文件当中。再细分,一个区段当中,可以分为多个区块(block)。区块是Oracle数据库当中最小的空间分配单位。
一个文件在磁盘空间当中存储一般都不是连续的,因此,表空间当中的段是由不同数据文件当中的区段组成的。
1、默认表空间
Oracle安装完后(以Oracle11g为例),会有五个个默认的表空间,分别是:
SYSAUX:安装Oracle11g示例的数据库表空间。
SYSTEM:存储sys/system用户表、存储过程、视图等数据库对象。
UNDOTBS1:用于存储撤销(用于回滚)的信息。
TEMP:临时表空间,用于存储SQL语句处理的表和索引信息。
USERS:存储数据库用户创建的数据库对象信息。
2、查看表空间
想查看数据库所有默认表空间,可以通过数据字典dba_tablespaces进行查询,如下图所示:
3、查看指定用户的默认表空间
如果想查看指定用户的默认表空间可以通过数据字典DBA_USERS进行查询,下面我利用查询语句,分别查询出SYS、SYSTEM、STUDENT(笔者创建的)用户分别对应的表空间是什么,查询代码如下:
- select T.username,--用户名
- T.account_status,--用户状态
- T.default_tablespace,--默认表空间
- T.temporary_tablespace,--临时表空间
- T.created--创建时间
- from dba_users t
- where t.username in ('SYS', 'SYSTEM', 'STUDENT')
通过结果可以看出,SYS、SYSTEM的默认表空间都是SYSTEM,临时表空间为TEMP,而STUDENT的表空间是笔者指定的USERS表空间。
二、创建表空间
Oracle创建表空间是数据库管理员经常要做的事情,在实际当中,一般独立的业务系统会有一个独立的用户进行独立开发管理,附带的会独立创建一个自己的表空间进行存储。
Oracle创建表空间可以通过OEM企业管理器、SQL命令两种方式进行创建,笔者这里采用SQL命令方式进行讲解,OEM方式读者可以自行登录OEM后台自行试验。
Oracle创建表空间语法结构如下:
- create tablespace tab_name
- datafile 'filename'
- size n
- [autoextend on next n1 maxsize m /of]
- [permanent]
- [extent management local/dictionary];
语法解析:
create tablespace:创建表空间的关键字。
tab_name:创建后表空间的名字。
datafile:指定数据文件的路径为filename。
size n:指定数据文件的大小。
[autoextend on next n1 maxsize m /of ]:表示表空间是否是自动扩展的,on 为自动扩展,of为不扩展,当自动扩展时,next n1表示自动扩展的大小,max size m 表示数据文件最大扩展到m大小。
[permanent] :表示创建的表空间的类型,permanent表示永久表空间,不填都是默认永久表空间。
[extent management local/dictionary]:表示表空间管理的方式,local表示本地的管理模式,dictionary表示数据字典管理模式,默认都是本地管理方式。
案例1、根据表空间创建语法,创建一个100M大小数据文件(student.dbf)的表空间student,代码如下:
- create tablespace student
- datafile 'E:\APP\ADMIN\ORADATA\ORCL\student.DBF'
- size 100m
- autoextend on next 10m maxsize 500m
- permanent
- extent management local;
案例解析:
创建一个student表空间,指定了数据文件为“E:\APP\ADMIN\ORADATA\ORCL\student.DBF”,表空间是自动扩展的,每次自动扩展大小为10M,最大扩展到500M,创建的是永久表空间,用来存储student用户的数据库对象和数据,管理模式为本地管理。
我们查看数据字典dba_data_files和dba_tablespaces对创建好后的student表空间进行查询,查询代码如下:
- select t.TABLESPACE_NAME, --表空间名
- t.FILE_NAME, --文件名
- t.AUTOEXTENSIBLE, --是否自动扩展
- t.BYTES / 1024 / 1024, --表空间初始大小
- t.MAXBYTES / 1024 / 1024, --表空间最大扩展到多少
- b.CONTENTS, --表空间类型
- b.EXTENT_MANAGEMENT --表空间管理模式
- from dba_data_files t, dba_tablespaces b
- where t.TABLESPACE_NAME = b.TABLESPACE_NAME
三、删除表空间
Oracle删除表空间的操作经常发生在数据库部分业务拆分的情况下,会把不必要的表空间和对应的数据文件删除,释放当前的数据库的硬件空间。
删除表空间可以通过OEM企业管理、SQL命令两种方式进行直接删除。Oracle删除表空间的时候不需要先删除数据文件,再删除表空间,可以选择删除表空间时,把数据文件一并删除。
Oracle删除表空间语法结构:
- drop tablespace tab_name [including contents][cascade constraints]
语法解析:
drop tablespace:删除表空间的关键字,tab_name表示表空间名字。
[including contents]:表示在删除表空间的时候把表空间中的数据文件一并删除。
[cascade constraints]:表示在删除表空间的时候把表空间的完整性也一并删除。比如表的外键,和触发器等就是表的完整性约束。
案例1、删除student表空间,并删除表空间的数据文件和完整性,代码如下:
- drop tablespace student
- including contents
- cascade constraints;
再查下一下表空间,发现student表空间不存在了,如下图:
四、临时表空间
通过Oracle表空间的讲解,我们了解到表空间是Oracle数据库存储数据和对象的逻辑容器,那临时表空间呢?
Oracle临时表空间主要是存储数据库的排序操作、临时表、中间排序结果等临时对象。例如,我们进行大数量级的排序操作时,当数据库内存不够时,就会写入临时表空间,当操作完成后,临时表空间就会自动清空释放。Oracle经常使用到临时表空间的操作有:create index(创建索引)、group by(分组查询)、order by(排序时)、集合运算时(union、minus、intersect)、多表连接查询时,当数据库内存不足时,会用到临时表空间。
创建临时表空间
Oracle数据库在安装完后就会创建一个默认的临时表空间temp。Oracle创建临时表空间的语法结构和创建持久化表空间一样,只是多了关键字temporary进行创建临时表空间。
创建临时表空间语法:
- create temporary tablespace tempname
- tempfile 'filename'
- size m;
语法解析:
1、create temporary tablespace:表示创建临时表空间,tempname表示创建临时表空间的名字。
2、filename:指定临时表空间数据文件的位置。
3、size m:表示临时表空间的大小。
案例1、创建临时表空间temp1,代码如下:
- create temporary tablespace temp1
- tempfile 'E:\APP\ADMIN\ORADATA\ORCL\temp1.DBF'
- size 50m;
创建好临时表空间temp1,我们可以通过数据字典dba_temp_files进行查询临时表空间的信息,查询代码如下:
- select t.TABLESPACE_NAME, --表空间名
- t.FILE_NAME, --文件名
- t.AUTOEXTENSIBLE, --是否自动扩展
- t.BYTES / 1024 / 1024 as tsize, --表空间初始大小
- t.MAXBYTES / 1024 / 1024 msize, --表空间最大扩展到多少
- b.CONTENTS, --表空间类型
- b.EXTENT_MANAGEMENT --表空间管理模式
- from dba_temp_files t, dba_tablespaces b
- where t.TABLESPACE_NAME = b.TABLESPACE_NAME
五、临时表空间组
我们了解到临时表空间主要存储数据库进行数据操作时的中间临时数据的存储,实际应用当中,经常多用户进行大数据量关联查询时或排序查询时,我们的临时表空间经常会不够用,导致查询中断。
Oracle10g之前,我们只能通过扩充临时表空间,因为,Oracle10g之前每个用户只能指定一个临时表空间。但是在Oracle11g中Oracle数据提供了Oracle临时表空间组的概念。应许把多个临时表空间组成一个组,然后把用户指定到这个临时表空间组,从而达到一个用户可以同时使用多个临时表空间的目的。
Oracle临时表空间组中至少得有一个临时表空间,并且同组下的表空间不能有重名。Oracle临时表空间组不用显式的创建,在创建临时表空间的时候为他指定一下临时表空间组即可,实际上创建临时表空间组就是为表空间设定组。创建的方式有如下两种:
1、创建临时表空间时指定临时表空间组:这种创建的方式和创建表空间的语法很相似,语法如下:
- create temporary tablespace tempname
- tempfile 'filename'
- size m
- tablespace group groupname;
下面,我们就在创建临时表空间temp2的同时,为它指定一个临时表空间组tempgroup。代码如下:
- create temporary tablespace temp2
- tempfile 'E:\APP\ADMIN\ORADATA\ORCL\temp2.DBF'
- size 50m
- tablespace group tempgroup;
然后,我们通过数据字典dba_tablespace_groups临时表空间组的创建情况:
2、把原有的临时表空间转移到创建好的临时表空间组当中,下面把临时表空间temp1转移到tempgroup组中,代码如下:
- alter tablespace temp1
- tablespace group tempgroup;
然后,我们通过数据字典dba_tablespace_groups查询下临时表空间组的创建情况:
创建好临时表空间组,可以把数据库的默认临时表空间设置为表空间组,也可以把对应的用户的临时表空间替换成临时表空间组,从而达到优化临时表空间的目的,代码如下:
- --修改数据库默认临时表空间
- alter database default temporary tablespace tempgroup;
- --修改用户默认临时表空间
- alter user student temporary tablespace tempgroup;
如图所示:已经用户student的临时表空间指向了tempgroup临时表空间组。
转载本站内容时,请务必注明来自W3xue,违者必究。