您现在的位置是:首页
>
oracle增加临时表空间大小 计算LMT表空间的大小该怎么建是最优的
计算LMT表空间的大小该怎么建是最优的 使用LMT时 不更新数据字典 不产生回滚活动 自动跟踪相邻的自由空间 不需要合并盘区 通过更新自由块和已用块的位映射来管理空间 避免了递归的空

计算LMT表空间的大小该怎么建是最优的
使用LMT时 不更新数据字典 不产生回滚活动 自动跟踪相邻的自由空间 不需要合并盘区 通过更新自由块和已用块的位映射来管理空间 避免了递归的空间管理操作 有UNIFORM和AUTOALLOCATE两种指定盘区大小方法 缺省为AUTOALLOCATE 临时表空间用LMT管理则仅仅只能用UNIFORM分配方式 针对LMT NEXT 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 oradataoraexpabc dbf size k extent management local uniform size k; 立即查看DBA_FREE_SPACE SYS@ORAEXP:ADMIN> select * from dba_free_space where tablespace_name= ABC ; TABLESPACE_NAME FILE_ID BLOCK_ID BYTES BLOCKS RELATIVE_FNO ABC 这里看到block_id= 说明已经使用了 块 这 块就是给这个数据文件分配的BITMAP使用的 * = KB 另外 我们建立这个表空间是 KB 也就是 块 但现在只有 块 加上已用的 块 也只有 块 还有 块到哪里去了?因为一个盘区是 / = 个块 个块还不能构成一个盘区 所以被浪费了 这就是为什么上面说的在建立表空间数据文件是要在数据文件大小上再加上 K的原因了 再看看效果 SYS@ORAEXP:ADMIN> create tablespace abc_ datafile d:oracle oradataoraexpabc_ dbf size k extent management local uniform size k; SYS@ORAEXP:ADMIN> select * from dba_free_space where tablespace_name= ABC_ ; TABLESPACE_NAME FILE_ID BLOCK_ID BYTES 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_ID BYTES 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_ID BYTES 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_ID BYTES BLOCKS RELATIVE_FNO ABC 看出只用了 块 也就是 KB 还是按照UNIFORM SIZE K分配的 并没有使用建表里NEXT KB参数 SYS@ORAEXP:ADMIN> L SELECT INITIAL_extent next_extent min_extentS max_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_id file_id block_id bytes blocks from dba_extents where segment_name= ABC ; EXTENT_ID FILE_ID BLOCK_ID BYTES BLOCKS 得到结论 建LMT表空间时 考虑在建立的数据文件大小上再加 KB 对于LMT表空间 建表STORAGE里的参数基本没什么用处了 仅仅是在第一次分配时参考INITIAL和NEXT参数分配空间 实际还是按照UNIFORM SIZE来分配盘区 EXP/IMP时应该避免使用PRESS=Y参数 否则初始盘区会很大的 要做到准确的性能测试 其实是很复杂的 一般而言 虽然LMT的表空间不会比DICT的表空间性能上强很多 但是不会更差 的 你要做性能的对比测试 应该给他们完全相等的条件 比如 你第一次已经做了测试 做了大量的数据插入 但是在第二次做测试的时候 可能就会出现ckpt 不能完成的情况 这样一来 第二次的性能数据肯定会大大打折扣的 至于空间管理 我现在的 基本上都采用了LMT + Uniform 的大小 按照表的增长和大 小来划分不同的表空间 基本上不再区分索引和表了 lishixinzhi/Article/program/Oracle/201311/17473 很赞哦! (1051)