一,行迁移和行链接。
oracle尽量保证一行的数据能够放在同一个数据块当中,有的时候行会发生行迁移和行链接。
行链接 :有一个列的字段是大对象(long,longlong)一行占的数据一整个块都放不下,则oracle会把这行的数据分为两部分或多部份,存放到不同的数据块,这种现象叫做行链接。
行链接的缺陷显而易见,原本我只需要找到一个块就能找到所有数据,现在可能读更多的块才能够找到数据,增加了io。
行迁移:原本的行在一个数据块中,如果我们在这一行进行了update操作,使得这一行的尺寸变大了
oracle在默认情况下,如果这一行发生了增长,所需的多余空间会从这个块的可用空间里面去获取,这是最好的情况。但是如果这个块可用的空间用满了,则会发生行迁移。oracle会把这一行的数据迁移到一个新的数据块,但是在原来的块中会保留它的row id。
缺陷也是如此,原来只需要一次io,现在需要两次io,降低了性能。
二,自动段空间管理(Auto Segment Space Management)
简称ASSM
段是oracle管理空间的一种机制
如果表空间是自动管理的,则会用到位图管理机制。
BMB(bitmap blocks) 在一个段中会有很多个位图块,在位图中记录了对应块的信息,如(剩余空间,可用空间,这个机制使得管理更加灵活)
总结一下就是:我们给段分配很多数据块,oracle会拿出一些数据块来记录这些数据块的使用情况,这些数据块叫做:BMB(位图块)。
三,oracle表空间分配类型
主要分为两种方式:1.uniform(固定分配)。2.autoallocate(自动分配)
示例:
自动分配:
固定分配:
四,使用 unusable索引
如果把一个索引变成unusable,oracle会把这个索引段删掉,但是保留索引的定义,节省了空间,以后需要时可以用rebuild重建索引。
五,使用临时表
临时表只有在事务和会话过程中存在数据。
如果我们以后为了测试。表中的数据有没有无所谓,我们可以基于有数据的表建一个临时表,我们在临时表上面进行测试,退出会话时oracle会把这个临时表删掉。
临时表有两种类型:
Global:建的临时表的定义所有的会话都可见,内容只有创建临时表的会话看得见,其它会话不可见
Private:只有创建临时表的会话可见,其它会话不可见。
临时表的段只有在进行第一次insert操作时才会分配,
创建全局临时表:
插入数据后当前会话可见,其它会话不可见。
on commit delete 关键字:当事务提交,临时表数据全部删除。
创建私有临时表:
注意:私有临时表 ,表名必须以 ORA$PTT_开头。
私有表前缀由private_temp_table_prefix 指定,可以自己指定
六,表压缩
1.Basic table compression(基础压缩) 压缩率:10倍
2.Advanced row compression(高级行压缩) 压缩率:2-4倍
压缩原理:
Basic table compression 当可用空间 是0 时触发压缩。
Advanced row compression 当可用空间 剩余10% 触发压缩
例如:数据块可用空间只剩下百分十10,触发压缩,把原来块的数据进行压缩,腾出来一部分空间来存放新的数据,再进行insert操作后,可用空间又只剩下百分十10,再一次进行压缩。
总结:oracle的压缩原理是逐步压缩。
basic压缩:
空间大小比较:
注意如果使用 basic压缩方式 使用insert方式进行插入则不会进行压缩。
高级行压缩:
不压缩,插入数据十次:
insert into EMP_NOCMP select * from emp_nocmp; (重复 10 次)
高级行压缩,插入数据十次:
insert into EMP_CMP select * from emp_cmp; (重复 10 次)
所占空间对比:
比较清晰,高级行压缩所占空间明显减少。
表压缩缺陷:
打开计时器,对表进行update操作,比对压缩表和非压缩表效率:
可见非压缩表 update性能明显高于压缩表。
七,通过 shringking 操作回收空间
只能对段空间管理方式为ASSM方式的表空间使用。
如果块中发生大量的delete操作,导致块中的行不紧凑,浪费了大量块空间,我们可以通过shringking 操作回收空间,降低高水位线,从而高水位线以上的块就会被回收。
示例:创建一个表,表空间段空间管理为自动管理,即ASSM,插入十五次数据。
insert into emp_shr select * from emp_shr;(执行15次)
查看数据字典,该表占用空间情况:
进行删除操作,导致出现空闲空间。
让表允许移动行,否则无法使用shrink:
对表进行shrink整理,查看数据字典。
发现此时空间并没有被释放,原因是我们的高水位线并没有变低,只是把行变的紧凑了,没有块被oracle自动回收。
改变高水位线,让高水位线以上的空闲块被oracle回收。
此时,查看数据字典。
八,可恢复空间分配。
Oracle 数据库服务器提供了一种暂停和稍后恢复执行的方法空间分配失败时的大型数据库 操作。
简而言之:假如我们的表空间大小不够了,正常来说会直接报错,假如我们执行了两个小时的inert操作,到最后因为表空间大小不足而导致操作失败就很崩溃,所以oracle允许我们有补救措施。
resumable_timeout = 300;
假如我们的操作因为表空间大小不足,设置这个参数后不会立即报错,而是会把这个事务挂起,在300s中,如果我们有补救措施,如resize表空间,增加了数据文件,使得表空间足够进行接下来的操作,该操作将继续进行。
如果300s之内没有补救,才会报错,该操作失败。