ORACLE初始化时,它会默认的创建两个表空间SYSTEM SYSAUX各自的意义此处不描述
首先讲一下,ORACLE允许DBA创建多处表空间,这有什么好处了?
1. 把用户的数据从数据字典中分离,可以减少IO竞争
2. 不同应用的数据放在不同的表空间,便于管理
3. 把不同表空间的数据文件放在不同的磁盘上可以减小IO竞争
4. 由于有了多个表空间,这样就可以允放一部分表空间在线,而另一部分表空间离线,而彼此互不影响
5. 对不同的应用数据创建各自表空间,效率更高
6. 方便倍份
接下来看看怎么创建表空间?
首先在你的数据服务器上创建目录,也就是建一个文件夹用来存放你的数据。 接着你就可以在SQLPLUS中创建表空间了,运用SQL语法
CREATE TABLESPACE(永久表空间) || CREATE TEMPORARY TEABLSPACE(临时表空间).....(不同的参数)
你也可以创建UNDO表空间,用于倍份用,自己去查查吧
以下我们来详细的讲讲
首先推荐建的表空间是本地管理表空间
我们先来看看本地管理空间的好处吧:
1.它更快,并发的空间操作,(因为他用的是BITMAP)
2.效率更高
3.空间分配更简单,因为有AUTOALLOCATE
4.由于是本地管理,对数据字典的信赖很小
具体的创建语法是:
CREATE TABLESPACE xxx(NAME)
DATAFILE '....'
EXTENTS MANAGEMENT LOCAL
注:首先,创建永久有空间时,系统默认的就是本地管理,但我们有时需要明确写出这一句话,是因为,当我们想要指定AUTOALLOCATE || UNIFORM.子句时,我们必时显示的写出这句。
表空间对EXTENTS的控制
CREATE TABLESPACE xxx DATAFILE '.....' SIZE50m
EXTENET MANAGEMENT LOCAL AUTOALLOCATE;
这一句创建了一个表空间50M大小,并指定是本地管理+AUTOALLOCATE
AUTOALLOCATE有什么用了?
让我来告诉你吧,它指定该表空间的最小extent大小为64K
替换AUTOALLOCATE的参数是UNIFORM,看看以下语句你就知道了
CREATE TABLESPACE xxx DATAFILE '...' SIZE50M
EXTENT MANAGEMENTLOCAL UNIFORM. SIZE 128k;
这是什么意思?就是在EXTENT bitmap中每128K段对应于bitmap的一个BIT
表空间对SEGMENTS的控制
创建表空间初了可以控制EXTENT外还可以指定SEGMENT的参数。我们接着来看看吧。
ORACLE提供了两种控制SEGMENT的方法,一种是自动的,一种是手工的,两者的区别在于,手工的采用freelists去管理SEGMENT中的空(未使用)空间,而自动的采用的是BITMAP,所以自动管理模式效率更高,也是ORACLE推荐使用的。默认情况下,你创建的表空间是SEGMENT自动管理的。当然显示指出也不是一件坏事。
CREATE TABLESPACE xxx DATAFILE '...' SIZE50m
EXTENT MANAGEMENT LOCAL
SEGMENT SPACE MANAGEMENT AUTO;
如果你想人工管理只要把上面的SEGMENT SPACE
MANAGEMENT AUTO --->SEGMENT SPACE MANAGEMENT MANUAL
下面再说一个最重要的东西,BLOCKSIZE
CREATE TABLESPACE xxx DATAFILE '...' SIZE50m
EXTENT MANAGEMENT LOCAL UNIFORM. SIZE 128K
BLOCKSIZE 16k;
为什么我们要指定BLOCKSIZE了?为什么我们不使用系统标准的BLOCKSIZE了?
这是个好问题,我们来看看吧,
ORACLE的BLOCK SIZE规则是这样的,应该是OS BLOCK SIZE的整数倍,而且应该小于OS IO SIZE,这里的OS IO SIZE是指的什么概念?难道操作系统不是以OS BLOCK SIZE为单位来进行IO的么??
为了提高效率,OS一般都不是以OS BLOCK SIZE来作一次IO,而是在一次IO中读取一定数量的OS BLOCK,在unix平台,一般OS IO为64k(这个跟平台有关系,不同的平台是不一样的。)如果ORACLE的BLOCK SIZE>OS的IO,则意味着如果oracle需要从datafile中读取一个oracle block,则需要OS两次或者更多次的IO,这显然会影响系统的效率。
这下你明白了为什么我们要设BLOCKSIZE了吧,为了提高IO效率,哈哈!追求高效率是我前进的动力。