使用LMT时不更新数据字典不产生回滚活动 自动跟蹤相邻的自由空间不需要合并盘区 通过更新自由块和已用块的位映射来管理空间避免了递归的空间管理操作 有UNIFORM和AUTOALLOCATE两种指定盘区大小方法缺省为AUTOALLOCATE 临时表空间用LMT管理则仅仅只能用UNIFORM分配方式 针对LMTNEXT PCTINCREASE MINEXTENTS MAXEXTENTS and DEFAULT STORAGE 将不再起作用 用UNIFORM指定一个值表示盘区大小缺省是M而对AUTOALLOCATE你只要指定一个初始盘区的大小ORACLE会自动用一个最佳值为其他盘区指定大小最小是KB这也是固定表空间中系统管理的缺省盘区大小 这里我还不明白这是说ORACLE为其他的盘区分配的盘区大小是不定的但最小是Kb不知这个理解对不对那么初始盘区该设多大呢?最小也是KB吧如此说AUTOALLOCATE方式比UNIFORM方式更好吗? 盘区的分配 ORACLE首先在第一个属于这个表空间的数据文件中分配一个新的盘区先为需要的相邻自由块数目在这个数据文件中查找位映射(BITMAP)如果这个数据文件没有足够的自由块数目ORACLE则查找下一个数据文件当这个盘区释放了ORACLE修改数据文件的位映射 位映射管理 假设指定的一个盘区大小是KB一个数据块的大小是KB则 /=表示位映射中的每一位都表示块 我的环境是WIN+ORACLE db_block_size= 问题一理解BITMAP管理 首先建立表空间 SYS@ORAEXP:ADMIN> create tablespace abc datafile d:\oracle\oradata\oraexp\abcdbf size k extent management local uniform size k; 立即查看DBA_FREE_SPACE SYS@ORAEXP:ADMIN> select * from dba_free_space where tablespace_name=ABC; TABLESPACE_NAMEFILE_ID BLOCK_IDBYTES BLOCKS RELATIVE_FNO
ABC
这里看到block_id=说明已经使用了块这块就是给这个数据文件分配的BITMAP使用的*=KB 另外我们建立这个表空间是KB也就是块但现在只有块加上已用的块也只有块还有块到哪里去了?因为一个盘区是/=个块个块还不能构成一个盘区所以被浪费了这就是为什么上面说的在建立表空间数据文件是要在数据文件大小上再加上K的原因了 再看看效果 SYS@ORAEXP:ADMIN> create tablespace abc_ datafile d:\oracle\oradata\oraexp\abc_dbf size k extent management local uniform size k; SYS@ORAEXP:ADMIN> select * from dba_free_space where tablespace_name=ABC_; TABLESPACE_NAMEFILE_ID BLOCK_IDBYTES BLOCKS RELATIVE_FNO
ABC_
只要加上K就能救回很多空间来!!! 问题盘区的分配 建立一张表 SYS@ORAEXP:ADMIN> CREATE TABLE ABC(A VARCHAR()) TABLESPACE ABC STORAGE (INITIAL K NEXT K ); SYS@ORAEXP:ADMIN> SELECT* FROM DBA_FREE_SPACE WHERE TABLESPACE_NAME=ABC; TABLESPACE_NAME FILE_ID BLOCK_IDBYTES BLOCKS RELATIVE_FNO
ABC
可见并没有按照建表定义里的参数INITIAL来分配表空间而是按照定义的UNIFORM SIZE来分配盘区的 如果定义INITIAL参数大于UNIFORM SIZE 定义呢? 先DROP 表 ABC恢复到表空间ABC初始定义的状态 再重建表ABC SYS@ORAEXP:ADMIN> CREATE TABLE ABC(A VARCHAR()) TABLESPACE ABC STORAGE (INITIAL K NEXT K); SYS@ORAEXP:ADMIN> SELECT * FROM DBA_FREE_SPACE WHERE TABLESPACE_NAME=ABC; TABLESPACE_NAME FILE_ID BLOCK_IDBYTES BLOCKS RELATIVE_FNO
ABC
分配块也就是KB因为建表是定义INITIAL是KB按照UNIFORM SIZE K 只能分配KB才能满足 再让表扩展一个盘区 SYS@ORAEXP:ADMIN> ALTER TABLE ABC ALLOCATE EXTENT; 表已更改 SYS@ORAEXP:ADMIN> SELECT * FROM DBA_FREE_SPACE WHERE TABLESPACE_NAME=ABC; TABLESPACE_NAME FILE_ID BLOCK_IDBYTES BLOCKS RELATIVE_FNO
ABC
看出只用了块也就是KB还是按照UNIFORM SIZE K分配的并没有使用建表里NEXT KB参数 SYS@ORAEXP:ADMIN> L SELECT INITIAL_extentnext_extentmin_extentSmax_extentS from dba_segmentS * where segment_name=ABC SYS@ORAEXP:ADMIN> / INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS 这里就可以看到ABC表的初始盘区是KB具体盘区分配 SYS@ORAEXP:ADMIN> select extent_idfile_idblock_idbytesblocks from dba_extents where segment_name=ABC; EXTENT_IDFILE_ID BLOCK_IDBYTES BLOCKS 得到结论 建LMT表空间时考虑在建立的数据文件大小上再加KB 对于LMT表空间建表STORAGE里的参数基本没什么用处了仅仅是在第一次分配时参考INITIAL和NEXT参数分配空间实际还是按照UNIFORM SIZE来分配盘区EXP/IMP时应该避免使用COMPRESS=Y参数否则初始盘区会很大的 要做到准确的性能测试其实是很复杂的 一般而言虽然LMT的表空间不会比DICT的表空间性能上强很多但是不会更差 的 你要做性能的对比测试应该给他们完全相等的条件 比如你第一次已经做了测试做了大量的数据插入但是在第二次做测试的时候可能就会出现ckpt 不能完成的情况这样一来第二次的性能数据肯定会大大打折扣的 至于空间管理我现在的基本上都采用了LMT + Uniform 的大小按照表的增长和大 小来划分不同的表空间 基本上不再区分索引和表了 |