熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

計算LMT表空間的大小該怎麼建是最優的

2022-06-13   來源: Oracle 

  使用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_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\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_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_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_ID  FILE_ID  BLOCK_ID   BYTES   BLOCKS
  
                   
                   
                   
                   
  
  得到結論
  建LMT表空間時考慮在建立的數據文件大小上再加KB
  對於LMT表空間建表STORAGE裡的參數基本沒什麼用處了僅僅是在第一次分配時參考INITIAL和NEXT參數分配空間實際還是按照UNIFORM SIZE來分配盤區EXP/IMP時應該避免使用COMPRESS=Y參數否則初始盤區會很大的
  
  要做到准確的性能測試其實是很復雜的
  
  一般而言雖然LMT的表空間不會比DICT的表空間性能上強很多但是不會更差 的
  
  你要做性能的對比測試應該給他們完全相等的條件
  
  比如你第一次已經做了測試做了大量的數據插入但是在第二次做測試的時候可能就會出現ckpt 不能完成的情況這樣一來第二次的性能數據肯定會大大打折扣的
  至於空間管理我現在的基本上都采用了LMT + Uniform 的大小按照表的增長和大
  
  小來劃分不同的表空間
  基本上不再區分索引和表了
  

From:http://tw.wingwit.com/Article/program/Oracle/201311/17473.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.