現象一描述:
在oracle12c下創建一個分區表T_A_TRADING,新建一個分區P1,P1里沒有任何紀錄時,查user_segments表發現 PARTITION_name='P1'結果返回Null,說明此時P1是沒有分配空間的。
現象二描述:
當給分區P1僅插入一條記錄時,查user_segments表發現 PARTITION_name='P1'結果返回:
segment_name partition_name (bytes/1024/1024)
---------------------------------------------------------------------------------------
T_A_TRADING P20200220 8
發現這個分區占用的空間達到了8M,盡管只有一條記錄。
原因分析:
上面兩種現象的發生是由oracle12C的延遲段特性造成的,下面詳細介紹一下這個特性的由來和用法。
11gR2之前的版本中,當創建一張表時,會自動分配段空間。
- 創建普通表時,每個分區默認占用空間大小為0.0625m(64k)。
- 創建分區表時,每個分區默認占用空間大小為8M,是由_partition_large_extents參數控制,可以算是11.2.0.2開始的一個新特性,為了減少extent數量,提高分區表性能,而設置的一個參數,默認為true,即分區表的每個extent為8M。
- 創建普通索引和分區索引的默認大小也是64k,由系統參數_index_partition_large_extents控制(true-開;false-關),默認為true。
這樣做有幾個弊端:
1. 初始創建表時就需要分配空間,自然會占用一些時間,如果初始化多張表,這種影響就被放大。
2. 如果很多表開始的一段時間都不需要,那么就會浪費這些空間。
3. 如果數據量較大,而且數據分布較為均勻,建議設置_partition_large_extents為true。
為此,從11gR2開始,有一種新特性,叫延遲段,即延遲分配段空間。簡單講,默認將表(以及索引、LOB)的物理空間分配推遲到第一條記錄插入到表中時。即有實際的數據插入表中時,再為每個對象初始化空間分配。延遲段是否開啟由系統參數deferred_segment_creation決定(true-開;false-關)。
修改分區初始空間的辦法:
一、可以通過修改這個系統參數來改變分區的初始空間。
參數修改語句:
alter system set "_parition_large_extents"=false scope = both
有人指出,這個修改需要修改數據庫的安裝指導和統裝腳本,然后再加上這個參數的修改才行。
有位博主測試過這種方法,最后他發現_partition_large_extents參數確實是能夠控制分區表的extent大小,鏈接:https://www.cnblogs.com/wcwen1990/p/6656545.html。
我沒有試過這種方法,感覺危險系數較高。。。
二、指定分區表分區初始大小,參考非分區表的初始空間很小,為64K。
create table t_testuser
(
operateid number(20) not null,
logtime date default cast(current_timestamp at time zone '00:00' as date) not null
)
-- 創建分區
partition by range(logtime)
(
partition beforedata values less than (to_date('2019-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss')),
partition P20190110 values less than (to_date('2019-01-10 00:00:00','yyyy-mm-dd hh24:mi:ss')),
partition P20190115 values less than (to_date('2019-01-15 00:00:00','yyyy-mm-dd hh24:mi:ss')),
partition P20190120 values less than (to_date('2019-01-20 00:00:00','yyyy-mm-dd hh24:mi:ss'))
)
tablespace ring --一般方法建分區使用默認的初始空間8M,不用加后面的設置語句;
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
next 1M
minextents 1
maxextents unlimited
);