oracle11g之create table儲存引數initial和表空間autoallocate或uniform的關係

wisdomone1發表於2015-10-18

背景

  建表可以指定initial及next即分別指定初始區及再次分配區的大小,這些引數與區分配管理模式autoallocate及uniform又有何關係呢?
本文我們來回答這個問題。  


結論

  1,建立表時指定initial的優先順序要高於所屬表空間指定的autoallocate或者uniform的區管理模式


  2,表指定的initial時,表的初始區分配大小,會分為2個情況
      基於autoallocate區管理模式時,表的初始區分配大小,因為ORACLE分配的區大小有64K,1M,8M,64M;從官方文件可知,會從這4個區中選最接近initial指定的值的最大值,剛好就是1M的區
      採用四捨五入計算區的大小及個數


      基於uniform區管理模式,表的初始區如何分配,取決於建表時指定的initial及建立表空間時指定的uniform區大小,所以這裡表的初始區大小為3m,可見是由2個因素決定初始區如何分配;
      可見雖是由2個因素確定表的初始區分配大小,主要因素仍是所屬表空間uniform大小,且採用四捨五入方式分配區個數及大小

測試



1,資料庫版本
SQL> conn scott/system
Connected.
SQL> select * from v$version where rownum=1;


BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production


2,先看下基於本地管理表空間的autoallocate區管理模式下,建立表時指定initial,會如何表現?
SQL> select default_tablespace from user_users;


DEFAULT_TABLESPACE
------------------------------------------------------------
USERS


SQL> select tablespace_name,initial_extent,next_extent,extent_management,allocation_type,segment_space_management from user_tablespaces where tablespace_name='USERS';


TABLESPACE_NAME                INITIAL_EXTENT NEXT_EXTENT EXTENT_MANAGEMENT    ALLOCATION_TYPE    SEGMENT_SPAC
------------------------------ -------------- ----------- -------------------- ------------------ ------------
USERS                                   65536             LOCAL                SYSTEM             AUTO


SQL> create table t_initial_1(a int,b int) storage(initial 5m);


Table created.


SQL> select segment_name,extent_id,blocks,bytes from user_extents where segment_name='T_INITIAL_1';


no rows selected


SQL> insert into t_initial_1 values(1,1);


1 row created.


SQL> commit;


Commit complete.


可見initial指定初始分配的共計區大小
SQL> select segment_name,extent_id,blocks,bytes/1024/1024 initial_mb from user_extents where segment_name='T_INITIAL_1';


SEGMENT_NAME                    EXTENT_ID     BLOCKS INITIAL_MB
------------------------------ ---------- ---------- ----------
T_INITIAL_1                             0        128          1
T_INITIAL_1                             1        128          1
T_INITIAL_1                             2        128          1
T_INITIAL_1                             3        128          1
T_INITIAL_1                             4        128          1


但為何會分配共計5個1m的區呢,因為對於autoallocate的區管理模式,ORACLE分配的區大小有64K,1M,8M,64M;從官方文件可知,會從這4個區中選最接近initial指定的值的最大值,剛好就是1M的區,
所以會分配5個區,下面的測試正好驗證這一點


SQL> drop table t_initial_1 purge;


Table dropped.


SQL> create table t_initial_1(a int,b int) storage(initial 72k);


Table created.


SQL> insert into t_initial_1 values(1,1);


1 row created.


SQL> commit;


Commit complete.






SQL> select segment_name,extent_id,blocks,bytes/1024 initial_kb from user_extents where segment_name='T_INITIAL_1';


SEGMENT_NAME                    EXTENT_ID     BLOCKS INITIAL_KB
------------------------------ ---------- ---------- ----------
T_INITIAL_1                             0          8         64
T_INITIAL_1                             1          8         64




SQL> drop table t_initial_1 purge;


Table dropped.


SQL> create table t_initial_1(a int,b int) storage(initial 9m);


Table created.


SQL> insert into t_initial_1 values(1,1);


1 row created.


SQL> commit;


Commit complete.


SQL> select segment_name,extent_id,blocks,bytes/1024/1024 initial_mb from user_extents where segment_name='T_INITIAL_1';


SEGMENT_NAME                    EXTENT_ID     BLOCKS INITIAL_MB
------------------------------ ---------- ---------- ----------
T_INITIAL_1                             0       1024          8
T_INITIAL_1                             1        128          1




3,再看下基於本地管理表空間的iniform區管理模式下,建立表時指定initial,會如何表現?


可見基於uniform區管理模式的初始區分配大小為3m
SQL> select tablespace_name,initial_extent,next_extent,extent_management,allocation_type,segment_space_management from user_tablespaces where tablespace_name='TBS_UNIFORM';


TABLESPACE_NAME                INITIAL_EXTENT NEXT_EXTENT EXTENT_MANAGEMENT    ALLOCATION_TYPE    SEGMENT_SPAC
------------------------------ -------------- ----------- -------------------- ------------------ ------------
TBS_UNIFORM                           3145728     3145728 LOCAL                UNIFORM            AUTO


SQL> select 3145728/1024/1024 initial_mb from dual;


INITIAL_MB
----------
         3


對於uniform區管理模式,表的初始區如何分配,取決於建表時指定的initial及建立表空間時指定的uniform區大小,所以這裡表的初始區大小為3m,可見是由2個因素決定初始區如何分配
SQL> create table t_initial_2(a int,b int) tablespace tbs_uniform storage(initial 72k);


Table created.




SQL> insert into t_initial_2 values(1,1);


1 row created.


SQL> commit;


Commit complete.


SQL> select segment_name,extent_id,blocks,bytes/1024/1024 initial_mb from user_extents where segment_name='T_INITIAL_2';


SEGMENT_NAME                    EXTENT_ID     BLOCKS INITIAL_MB
------------------------------ ---------- ---------- ----------
T_INITIAL_2                             0        384          3


可見雖是由2個因素確定表的初始區分配大小,主要因素仍是所屬表空間uniform大小,且採用四捨五入方式分配區個數及大小
SQL> drop table t_initial_2 purge;


Table dropped.


SQL> create table t_initial_2(a int,b int) tablespace tbs_uniform storage(initial 4m);


Table created.


SQL> insert into t_initial_2 values(1,1);


1 row created.


SQL> commit;


Commit complete.


SQL> select segment_name,extent_id,blocks,bytes/1024/1024 initial_mb from user_extents where segment_name='T_INITIAL_2';


SEGMENT_NAME                    EXTENT_ID     BLOCKS INITIAL_MB
------------------------------ ---------- ---------- ----------
T_INITIAL_2                             0        384          3
T_INITIAL_2                             1        384          3




SQL> drop table t_initial_2 purge;


Table dropped.


SQL> create table t_initial_2(a int,b int) tablespace tbs_uniform storage(initial 20m);


Table created.


SQL> insert into t_initial_2 values(1,1);


1 row created.


SQL> commit;


Commit complete.


SQL> select segment_name,extent_id,blocks,bytes/1024/1024 initial_mb from user_extents where segment_name='T_INITIAL_2';


SEGMENT_NAME                    EXTENT_ID     BLOCKS INITIAL_MB
------------------------------ ---------- ---------- ----------
T_INITIAL_2                             0        384          3
T_INITIAL_2                             1        384          3
T_INITIAL_2                             2        384          3
T_INITIAL_2                             3        384          3
T_INITIAL_2                             4        384          3
T_INITIAL_2                             5        384          3
T_INITIAL_2                             6        384          3


7 rows selected.

個人簡介


8年oracle從業經驗,具備豐富的oracle技能,目前在國內北京某專業oracle服務公司從事高階技術顧問。
服務過的客戶:
中國電信
中國移動
中國聯通
中國電通
國家電網
四川達州商業銀行
湖南老百姓大藥房
山西省公安廳
中國郵政
北京302醫院     
河北廊坊新奧集團公司

 專案經驗:
中國電信3G專案AAA系統資料庫部署及最佳化
      中國聯通4G資料庫效能分析與最佳化
中國聯通CRM資料庫效能最佳化
中國移動10086電商平臺資料庫部署及最佳化
湖南老百姓大藥房ERR資料庫sql最佳化專案
四川達州商業銀行TCBS核心業務系統資料庫模型設計和RAC部署及最佳化
四川達州商業銀行TCBS核心業務系統後端批處理儲存過程功能模組編寫及最佳化
北京高鐵訊號監控系統RAC資料庫部署及最佳化
河南宇通客車資料庫效能最佳化
中國電信電商平臺核心採購模組表模型設計及最佳化
中國郵政儲蓄系統資料庫效能最佳化及sql最佳化
北京302醫院資料庫遷移實施
河北廊坊新奧data guard部署及最佳化
山西公安廳身份證審計資料庫系統故障評估
國家電網上海災備專案4 node rac+adg 
       貴州移動crm及客服資料庫效能最佳化專案
       貴州移動crm及客服務資料庫sql稽核專案
       深圳穆迪軟體有限公司資料庫效能最佳化專案

聯絡方式:
手機:18201115468
qq   :   305076427
qq微博: wisdomone1
新浪微博:wisdomone9
qq群:275813900    
itpub部落格名稱:wisdomone1    http://blog.itpub.net/9240380/

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9240380/viewspace-1814743/,如需轉載,請註明出處,否則將追究法律責任。

相關文章