1、网络数据库,内蒙古工业大学管理学院,王建国,(第六讲),3.4.1.3 表空间的划分,SYSTEM表空间 其它表空间 临时表空间(Temp) 回滚表空间(Undo) 用户的表空间(User) 索引表空间(Index),SYSTEM表空间,TEMP表空间,UNDO表空间,USER表空间,INDEX表空间,其它表空间,3.4.1.4 表空间的基本属性,1.联机表空间和脱机表空间 表空间数据的可用性 2.永久表空间和临时表空间 3.只读表空间和读写表空间,目录,3.1 Oracle9i数据库物理结构 3.2 Oracle9i数据库内存结构 3.3 Oracle9i数据库进程结构 3.4 Oracle
2、9i数据库逻辑结构 3.4.1 表空间 3.4.2 段、区间和数据块 3.4.3 模式对象 3.4.4 扩充存储空间 3.4.5 减少存储空间,3.4.2 段、区间和数据块,1. 段、区间和数据块概念 2. 块存储参数的设置 3. 区间存储参数的设置 4. 各级存储参数的优先级 5. 改变存储参数的影响 6. 创建基本表带存储参数的例子,3.4.2.1 段、区间和数据块概念,1 段、区间和数据块:代表数据库为存储数据而分配的数据空间单元。 2 段(segment):数据库对象(例如表、索引、数据族等)的物理存储区。 3 区间(extent):地址连续的数据块序列 4 数据块(block):数据
3、库在磁盘与系统内存间存取的最小单元,3.4.2.2 利用参数控制数据块空间使用,块空间可以利用的参数有: PCTFREE PCTUSED INITRANS MAXTRANS,3.4.2.2.1 PCTFREE,用该参数设置保留块的百分比,保留空间用于对已存在于块中的行的可能的修改。 为在插入过程中可能的修改保留的可用块空间的百分比 当达到PCTFREE限额时,块被认为已满,不能再插入新的行 块中的PCTFREE限额到达以后,保留在块中的空间为对已存在于块中的行的UPDATE命令服务 空闲空间用于插入新行、已存在行的增长以及数据块标题的增长 当空闲空间低于PCTFREE限额时,将从空闲队列中移出
4、该块 系统缺省值是20,3.4.2.2.1 PCTFREE(续),低PCTFREE允许将块填得更满,可以减少存储数据的块数目,但可能会产生行的链接(如一个表的列很多,一个数据块放不下一整行数据,就产生链接),或行的移动,(数据块的一行更新时长度增加并使块的空闲空间被填满,而该行数据又可以放在一个数据块中,就会被移到一个新的数据块中)。 低PCTFREE由于必须经常重新组织块,会增加处理的开销 高PCTFREE为将来的更新保留更多的空间,造成可能需要更多的块来保存数据。但可以减低行的链接和行移动的发生,不需要经常重新组织块,可以减少处理的开销。,3.4.2.2.2 PCTUSED,用该参数设置允
5、许一个块可插入新行时的空闲空间百分比,只要一个空闲块的使用率低于该值,又没有达到PCTFREE的限额时,就可以插入新行。 例如:假设现有一数据块空闲空间有1K,PCTFREE设为20,PCTUSED设为60,则该1K的空闲块需要留出0.2K的空间(1K*20%=0.2K),供对块中已存在的行可能进行修改时使用,剩余0.8K空间,只要使用空间未超过0.6K(1K*60%=0.6K),就可以对该块插入新行。 系统缺省值是40 经常的删除操作产生不连续的可用空闲空间,可能导致块碎片,将PCTUSED的值设置合理,可减少块碎片的增加 低PCTUSED造成块不是经常空闲,可以减少处理开销,但增加了不用的
6、空间 高PCTUSED造成块经常成为空闲,要增加处理开销,但提高了空间的利用率,3.4.2.2.3 INITRANS和MAXTRANS,INITRANS用于确定一个数据块中并发事务的事务入口的初始数目,MAXTRANS用于确定一个数据块中的最大并发事务数,3.4.2.3 区分配控制,存储参数: INITIAL 分配给一个段的第一个区的字节数。缺省值为5个数据块 NEXT为段分配的下一个增加区的字节数。缺省值为5个数据块 MAXEXTENTS可以为一个段分配的区的总数。最大值依赖于ORACLE块大小。缺省值为99 MINEXTENTS当段生成时分配的区的总数。缺省为1个区 PCTINCREASE
7、每一个增加区在前一个分配的增加区上增长的百分比。缺省为50% OPTIMAL(只针对回退段的设定)缺省为空 FREELISTS为向表中插入数据而保留的空闲块队列的数目 注:可以为表、索引、聚簇、回退段、表空间设置存储参数,3.4.2.4 存储参数的优先原则,存储参数在各实体上存储参数的优先原则: 实体级参数优先于表空间级对应的参数 当在实体级上没有显式地设置存储参数时,缺省使用表空间级参数 当表空间级没有显式地设置存储参数时,ORACLE提供系统缺省值 当存储参数修改后,新选项只适用于还没有分配的区,3.4.2.5 改变存储参数而产生的影响,不能修改INITIAL和MINEXTENTS 修改N
8、EXT:下一个增加的区使用新的NEXT值,以后的区正常地按PCTINCREASE增长 修改PCTINCREASE:由下面的公式重新计算NEXT的当前值NEXT=NEXT*(新的PCTINCREASE/旧的PCTINCREASE) 同时改变NEXT和PCTINCREASE:下一个区立即赋以NEXT的新值。从那点以后,NEXT的值由新的PCTINCREASE正常计算得出 表空间缺省值的修改只影响表空间中新创建的实体,3.4.2.6 创建基表带存储参数的例子,例:创建表ORDERS表并指定存储在表中的数据的存储参数,目录,3.1 Oracle9i数据库物理结构 3.2 Oracle9i数据库内存结构
9、 3.3 Oracle9i数据库进程结构 3.4 Oracle9i数据库逻辑结构 3.4.1 表空间 3.4.2 段、区间和数据块 3.4.3 模式对象 3.4.4 扩充存储空间 3.4.5 减少存储空间,3.4.3 对象,模式 表 视图 索引 数据族 同义词 序列 数据分区,3.4.3.1 模式,1.模式:数据库对象的逻辑组织 2.模式:逻辑概念,与数据库的物理存储无关 3.ORACLE模式与用户帐户一一对应 4数据字典:ORACLE在SYS模式下逻辑组织的对象集合,3.4.3.2 分区,分区是动态地把表中的数据分成较小的一些表,尽管这些分区在物理上被分割开,但在逻辑上仍属于一个整体,主要是
10、为了改善对大型表的管理,3.4.3.2.1 利用分区平衡I/O操作,由于分区是将表存储在不同的物理位置上,也可能存储在不同的磁盘上,这样,在利用表中的数据时,就会访问不同的磁盘,从而使I/O操作不是在一块磁盘上,达到平衡I/O操作的目的。 具体操作: 1)创建表时指定分区 如: CREATE TABLE AA (NO NUMBER(5) PRIMARY KEY,NAME VARCHAR2(8) PARTITION BY RANGE(NO) (PARTITION PART1 VALUES LESS THAN(4000)TABLESPACE TB1,PARTITION PART2 VALUES L
11、ESS THAN(8000) TABLESPACE TB2, PARTITION PART3 VALUES LESS THAN(MAXVALUE)TABLESPACE TB3);,3.4.3.2.1 利用分区平衡I/O操作(续),具体操作: 2)将分区所在的表空间指定到不同的磁盘 如: CREATE TABLESPACE TB1 DATAFILE C:ORACLEDATATB101.DBF 5M; . 3)用分区实现分散并行查询 访问表AA的操作就有可能被分散到不同的磁盘上,而不是集中在一个磁盘,达到平衡I/O目的,3.4.3.2.2 利用分区加快查询,分区后,进行数据查询可能是在多个磁盘同时
12、进行,加快了查询速度。 具体操作: 将查询操作分散到多个分区 如:SELECT * FROM AA(PART3)WHERE NO=9999; 为分区创建局部索引 分区支持索引,3.4.3.2.3 利用分区有利于备份和恢复,对表进行分区后,每一个分区就是一个独立的部分,可以进行单独备份和恢复,这样就使得备份和恢复工作简单易行。具体操作: 对某一分区进行备份 例: ALTER TABLESPACE TB1 BEGIN BACKUP; 用ALTER TABLE修改表分区定义 可以用该命令对分区进行一些其它改进,如存储参数,删除该分区的数据等等 用ALTER INDEX修改索引分区的定义,3.4.3.
13、2.4 利用分区减少污染区,如果一个分区的数据被损坏,不会影响到其它分区的数据,可以最大限度的保护数据安全。,目录,3.1 Oracle9i数据库物理结构 3.2 Oracle9i数据库内存结构 3.3 Oracle9i数据库进程结构 3.4 Oracle9i数据库逻辑结构 3.4.1 表空间 3.4.2 段、区间、数据块 3.4.3 模式对象 3.4.4 扩充存储空间 3.4.5 减少存储空间,3.4.4 扩充数据库的存储能力,3.4.4.1 改变系统表空间数据文件大小,系统(SYSTEM)表空间的数据文件是在创建数据库时给定了初值,不够用时,可以用修改数据库信息的命令来更改其值,语句:AL
14、TER DATABASE 数据库名DATAFILE 数据文件名 RESIZE 数值 ONLINE;,3.4.4.2 创建新的表空间,表空间是一个逻辑概念,实际的数据和结构是存储在数据文件中,当需要扩充数据库的存储空间时,有必要创建新的表空间并指定它的数据文件。 创建数据库时,应创建几个私用的表空间,把程序所用到的数据都存放在此,方便数据的维护和管理。不要把所有的数据都存放在SYSTEM表空间中。 创建表空间句法: CREATE TABLESPACE 表空间名 DATAFILE 数据文件名 SIZE 数值 存储参数 ONLINE;,3.4.4.2 逻辑结构创建表空间,3.2.1.7.2 逻辑结构
15、创建表空间,3.2.1.7.2 逻辑结构创建表空间,3.4.4.3 增加表空间大小,表空间的数据文件占满时,就不能继续向该表空间增加数据了。解决办法是向表空间中增加新的数据文件,以此来扩充表空间的存储能力。,句法:ALTER TABLESPACE 表空间名 ADD DATAFILE 数据文件名 SIZE 数值 ONLINE;,3.4.4.3 增加表空间大小,3.4.5 减少存储空间,3.4.5.1 正确使用数据类型,在创建表时要为每一列指定一个数据类型,并给一些列指定长度,使得表中的所有数据都遵循相应列上的完整性约束。选取合适的数据类型以及合适的长度就可以节省宝贵的空间资源。例如创建一个人员表
16、时: 第一次给姓名字段选取CHAR(30),显然长度设大了,如果表中存放的数据量很大时,就会造成较大的空间浪费 第二次修改姓名字段为CHAR(8),虽然长度设成了最接近实际姓名的大小,但由于数据类型CHAR在内存中按固定长度存储,显然还是不合适,依然会造成一定的浪费 第三次再次修改姓名字段为VARCHAR2(8),存储时按实际数据的长度来存放,因此就可以达到最佳效果,在实际应用中,应对每一列的数据类型和长度都进行检查,看是否设计合理,以求达到既不浪费空间又保证够用的最佳效果,3.4.5.2 正确设计存储参数,在创建对象时,若不指定存储参数,则采用表空间缺省的存储参数,如果缺省参数设置的不合理,
17、同样会造成存储空间的浪费。 1)合理使用INITIAL参数 应将此值设置得比对象实际所需的空间稍大一点,这样会具有最佳的性能和空间分配 2)合理使用NEXT和PCTINCREASE参数 对于一般的表,设计NEXT值与INITIAL的值相等比较合理,这样,即使第一个区(EXTENT)不够用,再分配一个新区也不会造成占用太多的空间;对于增长不太快的表,PCTINCREASE的值就应设置得小一些 3)合理使用PCTFREE和PCTUSED参数 对于一个行比较稳定的表,即一般不动态增长,可将PCTFREE设置得小些,对于数据删除很频繁的表,可将PCTUSED设置得大一些,但这两个参数均不能无限制的设置
18、过大,否则,PCTFREE过大,会产生行的链接或行的移动,PCTUSED过大,数据库马上把空闲空间利用起来,造成数据太杂乱,会影响到数据库的性能,3.4.5.3 将历史表空间归档,数据库中有一些历史数据,它们几乎从来不用,但可能将来某一天会用到,可以将这部分数据存档,回收相应的表空间,待用到时再恢复回来。以释放所占资源。具体操作: 建立历史表空间 用以存放历史数据 分离历史数据 将所有历史数据放到刚建立的历史表空间例如:用拷贝另一个表的方法在刚建立的历史表空间中新建一个同原表一样的表 删除原表释放空间 将历史表空间备份 将历史表空间的数据文件拷贝到其它介质上 删除历史表空间数据文件,3.4.5
19、.4 删除表空间或对象,对于一些不再使用的对象,可以将其删除以释放相应的空间,若整个表空间甚至可以将整个表空间删除掉。 具体操作: 删除无用对象 一些对象在使用了一段时间后就没用了,或为了某件工作而创建的临时对象,应删除回收空间。例如:某个临时表是为了移动数据而设的,用完之后应立即用DROP TABLE命令删除 删除表空间 命令:DROP TABLESPACE 表空间名 including contents cascade contraints; 删除表空间数据文件 删除了表空间后,只是把逻辑概念删除了,而物理文件还没有删除,此时需要在操作系统下将物理数据文件删除,在对一个已经删除的表空间的数据文件进行删除之前,需要将数据库关闭,