三、创建表空间

创建表空间的步骤因操作系统带的不同而不同。然而,在所有的情况中,用户都应该事先通过操作系统的功能创建一个目录结构,以便将新表

空间的数据文件(一个表空间必须要有一个数据文件)分配到相应的目录中。在大多数操作系统中,当通过添加数据文件来创建一个新表空间或

修改一个表空间时,应该指出大小和完全限定的文件名(即包括目录结构和文件的扩展名)。在每一种情况中,都由ORACLE按所指定的信息来自

动创建和格式化数据文件。
与表空间对应的物理结构是数据文件。在创建表空间的过程中要指定它所使用的数据文件的位置和文件名。实际上,在表空间的创建中,

ORACLE会完成以下几个工作:
1.在数据字典和控制文件中记录该新创建的表空间;
2.在操作系统中按指定的位置和文件名创建指定大小的操作系统文件,作为该表空间对应的数据文件;
3.在预警文件中记录创建表空间的信息。

CREATE TABLESPACE 创建(永久)表空间
CREATE BIGFILE TABLESPACE 创建大文件表空间
CREATE TEMPORARY TABLESPACE 创建临时表空间
CREATE UNDO TABLESPACE 创建撤销表空间

用户必须拥有CREATE TABLESPACE系统权限才能创建表空间。临时表空间和撤销表空间都是特殊表空间,他们与一般表空间不同的是,用户并不

能在其中创建方案对象,因此,需要在CREATE语句中添加TEMPORARY和UNDO关键词。
在ORACLE 8I以前,所有的表空间都创建为字典管理。从ORACLE 8I开始,用户能够创建本地管理的表空间,他们使用位图代替了数据字典表开

跟踪已用的和空闲的空间。因为本地管理的表空间有更好的性能,而且更加容易管理,所以,从ORACLE 9I开始,创建(永久)表空间都是本地管

理的。

创建表空间的语法是:
CREATE [SMALLFILE|BIGFILE] [PERMANENT|TEMPORARY|UNDO] TABLESPACE
DATAFILE|TEMPFILE datafile_clause[,datafile_clause]
[EXTENT MANAGEMENT LOCAL]
[AUTOALLOCATE|UNIFORM SIZE integer [K|M]]
[SEGMENT SPACE MANAGEMENT AUTO|MANUAL]
[BLOCKSIZE integer[K|M]]
[MININUM EXTENT integer [K|M]]
[LOGGING|NOLOGGING]
[ONLINE|OFFLINE [NORMAL|TEMPORARY|IMMEDIATE]];

其中,datafile_clause子句(数据文件子句)的语法是:
'path_filename_suffix' SIZE integer [K|M]
[REUSE]
[AUTOEXTEND OFF|ON]
[NEXT integer [K|M]]
[MAXSIZE UNLIMITED | integer [K|M]]
在datafile_clause子句中指定数据文件时,不能使用相对路径,只能使用绝对路径。并且,如果没有提供文件名的后缀,则无后缀。

(一)创建(永久)表空间
如果不指定PERMANENT,TEMPORARY,UNDO选项,或指定了PERMANENT选项,则创建的是永久表空间,即永久保存其中的数据库对象的数据。
有三种创建(永久)表空间的方法:
(1)使用AUTOALLOCATE区分配方式
如果DBA能够预测到表空间中存放的度喜爱那个所需要的区大小会有很大不同,则使用AUTOALLOCATE区分配方式是比较好的选择。在这种方式下

,ORACLE将自动按表空间中不同对象的大小分配相应大小的区(有一个表大小与区大小的对应关系,最小的区为64KB)。 AUTOALLOCATE区分配方

式的缺点是在表空间中可能会造成一些磁盘空间的浪费,但是这一点代价相对DBA工作量的减少来说是值得的。
CREATE TABLESPACE mytbs01 DATAFILE 'e:\mytbs01.dbf' SIZE 2M AUTOALLOCATE;

(2)使用UNIFORM区分配方式
如果DBA能够预测到表空间中存放的大部分对象都要求使用相同大小的区,那么,使用UNIFORM区分配方式是比较好的选择。在这种情况下,

ORACLE将为表空间中所有对象都分配指定的相同大小的区(默认大小是1MB)。UNIFORM区分配方式的优点是在表空间中不会产生磁盘碎片,节约

磁盘空间。
CREATE TABLESPACE mytbs02 DATAFILE 'e:\mytbs02_1.dbf' SIZE 1M, 'e:\mytbs02_2' SIZE 2M UNIFORM SIZE 128K;

(3)在数据字典子句中指定数据文件的扩展方式
可以在数据文件子句中指定数据文件的扩展方式。
CREATE TABLESPACE mytbs03 DATAFILE 'e:\mytbs03_1.dbf' SIZE 1M AUTOEXTEND ON NEXT 2M MAXSIZE 11M;
但是此时就不能再指定表空间的区分配方式了,否则会有错误提示。

(4)使用AUTO段管理方式
可以使用SEGMENT SPACE MANAGEMENT子句来指定表空间的段管理方式,即管理段中已用数据块和空闲数据块的方式。虽然ORACLE极力推荐为本

地管理的永久表空间使用AUTO段管理方式,但在ORACLE 10G中如果不使用SEGMENT SPACE MANAGEMENT子句指定AUTO,则使用MANUAL段管理方式。
CREATE TABLESPACE mytbs04 DATAFILE 'e:\mytbs04_1.dbf' SIZE 3M REUSE UNIFORM SEGMENT SPACE MANAGEMENT AUTO;

(5)使用BLOCKSIZE选项和创建非标准块表空间
有时候要求数据库支持多个块大小的表空间(大表的数据存放在大块的表空间上更有效),即必须创建有不同于初始化参数DB_BLOCK_SIZE指定的

标准的ORACLE块大小的表空间,此时就可以使用这个选项。这个选项只适用于永久表空间。
例如现在DB_BLOCK_SIZE参数的值是8K,则可以创建BLOCKSIZE选项是8K的表空间(如果不用BLOCKSIZE选项指定块的大小,就采用DB_BLOCK_SIZE

参数指定的大小)。
CREATE TABLESPACE mytbs05 DATAFILE 'e:\mytbs05_1.dbf' SIZE 3M REUSE BLOCKSIZE 8K SEGMENT SPACE MANAGEMENT AUTO;
但可能不能创建BLOCKSIZE参数值为16K的表空间,否则会有错误提示:
CRAETE TABLESPACE mytbs06 DATAFILE 'e:\mytbs06_1.dbf' SIZE 3M REUSE BLOCKSIZE 16K SEGMENT SPACE MANAGEMENT AUTO;
如果要为不同的表空间指定不同的块大小,就需要先修改初始化参数文件中的数据高速缓存区参数

(DB_2K_CACHE_SIZE,DB_4K_CACHE_SIZE,DB_8K_CACHE_SIZE,
DB_16K_CACHE_SIZE,DB_32K_CACHE_SIZE)才行

(二)创建大文件表空间
大文件表空间是ORACLE 10G数据库的新特性,而且仅在本地管理的表空间中才支持大文件表空间。这种表空间只能包括一个数据文件,该数据

文件可以包含4G个块。能显著提高ORACLE数据库的存储能力并减少数据文件的个数。
CREATE BIGFILE TABLESPACE mybigtbs01 DATAFILE 'e:\mybigtbs01_1.dbf' SIZE 2M SEGMENT SPACE MANAGEMENT AUTO;
在创建大文件表空间时可以指定区分配方式,但不能将段管理方式指定为MANUAL方式。
CREATE BIGFILE TABLESPACE mybigtbs02 DATAFILE 'e:\mybigtbs02_1.dbf' SIZE 2M UNIFORM SIZE 128K;
但是
CREATE BIGFILE TABLESPACE mybigtbs03 DATAFILE 'e:\mybigtbs03_1.dbf' SIZE 2M