分區默認segment大小變化(64k—>8M)


_partition_large_extents和_index_partition_large_extents

參考:

http://www.xifenfei.com/2013/08/%E5%88%86%E5%8C%BA%E9%BB%98%E8%AE%A4segment%E5%A4%A7%E5%B0%8F%E5%8F%98%E5%8C%9664k-8m.html

從11.2.0.2開始創建分區表,每個分區默認大小為8M,是由_partition_large_extents參數控制,可以算是11.2.0.2開始的一個新特性,為了減少extent數量,提高分區表性能,而引入的一個參數,默認為true,即分區表的每個extent為8M,這里對於_partition_large_extents為true和false的情況進行了測試。

例1:

數據庫參數情況如下:

SQL> select * from v$version;

BANNER

--------------------------------------------------------------------------------

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

PL/SQL Release 11.2.0.4.0 - Production

CORE 11.2.0.4.0 Production

TNS for Linux: Version 11.2.0.4.0 - Production

NLSRTL Version 11.2.0.4.0 - Production

SQL> alter system set "_partition_large_extents"=true;

System altered

SQL> alter system set "_index_partition_large_extents"=true;

System altered

SQL> show parameter _partition_large_extents

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

_index_partition_large_extents       string      TRUE

_partition_large_extents             string      TRUE

SQL> show parameter deferred_segment_creation--是否啟用延遲段

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

deferred_segment_creation            boolean     FALSE

1)創建分區表:

CREATE TABLE Table1001

(

  idd   INT,

  iNAME VARCHAR(10),

  grade INT

)

PARTITIONBYRANGE(grade)

(

PARTITION  part1 VALUESLESSTHAN(10)TABLESPACEtest,

PARTITION  part2 VALUESLESSTHAN(MAXVALUE)TABLESPACEtest

);

2)穿件普通表

CREATETABLE table1002

(

  idd   INT,

  iNAME VARCHAR(10),

  grade INT

)TABLESPACETEST;

3)創建索引

createindex ind1 on table1001(idd)local tablespacetest;

createindex ind2 on table1002(idd) tablespace test;

createindex ind3 on table1001(iname) tablespace test;

createindex ind4 on table1002(iname) tablespace test;

查詢segment視圖,確定初始創建表所占空間大小:

select t.segment_name,

       t.partition_name,

       t.tablespace_name,

       t.bytes /1024/1024||'m',

       t.blocks,

       t.extents

from dba_segments t

where t.tablespace_name ='TEST';

SEGMENT_NAME      PARTITION_NAME        TABLESPACE_NAME     T.BYTES/1024/1024||'M'         BLOCKS    EXTENTS

-------------------------------------------------------------------------------- -----------------------------

IND1 PART2 TEST 8m 1024 1

IND1 PART1 TEST 8m 1024 1

IND2 TEST               0.0625m 8 1

IND3 TEST               0.0625m 8 1

IND4 TEST               0.0625m 8 1

TABLE1001 PART2 TEST 8m 1024 1

TABLE1001 PART1 TEST 8m 1024 1

TABLE1002 TEST               0.0625m 8 1

結論:從例1可以得出結論,在11.2.0.4版本中,當參數_partition_large_extents等於true時(此時可能不可見),創建分區表默認占用空間大小為每個分區8m,而普通表默認占據空間大小僅0.0625m(64k)。而當_index_partition_large_extents為true時,創建分區索引時,默認分區大小為8m,而創建普通索引默認大小為64k。

例2:

SQL> alter system set "_partition_large_extents"=false;

System altered

SQL> alter system set "_index_partition_large_extents"=false;

System altered

SQL> show parameter _partition_large_extents

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

_index_partition_large_extents       string      FALSE

_partition_large_extents             string      FALSE

SQL> show parameter deferred_segment_creation

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

deferred_segment_creation            boolean     FALSE

創建分區表:

CREATETABLE Table1001

(

  idd   INT,

  iNAME VARCHAR(10),

  grade INT

)

PARTITIONBYRANGE(grade)

(

PARTITION  part1 VALUESLESSTHAN(10)TABLESPACEtest,

PARTITION  part2 VALUESLESSTHAN(MAXVALUE)TABLESPACEtest

);

創建普通表:

CREATETABLE table1002

(

  idd   INT,

  iNAME VARCHAR(10),

  grade INT

)TABLESPACETEST;

創建索引:

createindex ind1 on table1001(idd)localtablespacetest;

createindex ind2 on table1002(idd)tablespacetest;

createindex ind3 on table1001(iname)tablespacetest;

createindex ind4 on table1002(iname)tablespacetest;

查詢segment視圖,確定初始創建表所占空間大小:

select t.segment_name,

       t.partition_name,

       t.tablespace_name,

       t.bytes /1024/1024||'m',

       t.blocks,

       t.extents

from dba_segments t

where t.tablespace_name ='TEST';

SEGMENT_NAME      PARTITION_NAME        TABLESPACE_NAME     T.BYTES/1024/1024||'M'         BLOCKS    EXTENTS

-------------------------------------------------------------------------------- -----------------------------

IND1 PART2 TEST               0.0625m 1024 1

IND1 PART1 TEST               0.0625m 1024 1

IND2 TEST               0.0625m 8 1

IND3 TEST               0.0625m 8 1

IND4 TEST               0.0625m 8 1

TABLE1001 PART2 TEST               0.0625m 1024 1

TABLE1001 PART1 TEST               0.0625m 1024 1

TABLE1002 TEST               0.0625m 8 1

結論:通過測試證明,設置_partition_large_extents參數確實是能夠控制分區表的extent大小,而且對於分區表,deferred_segment_creation雖然為true,但是在一個分區表中如果有一個子分區插入了記錄,那么其他子分區會同時創建segment.對於數據量不多,而且數據大量集中在某幾個分區,那強烈建議設置_partition_large_extents為false,節約空間.如果數據量較大,而且數據分布較為均勻,建議設置_partition_large_extents為true.另外對於分區的index也有同樣意義的參數為_index_partition_large_extents。

可以看到在11.2.0.2 以后_partition_large_extents參數默認打開(default : TRUE),創建的初始化分區大小為8M。

實際該特性可能在導致以下2個問題:

若配合deferred_segment_creation=false使用則創建具有大量分區的表時,耗時大幅增長

若配合deferred_segment_creation=false使用則建好后空表的所占空間為8M*分區數目,對比關閉該特性的情況會大非常多


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM