deferred_segment_creation參數的主要作用是控制分區表中段的創建,例如很多情況下我們會預先創建未來一段時間某個表的分區表,但是我們還不想讓這些預先創建的分區表占用過多的空間,在這種情況下我們設置deferred_segment_creation為false,那么在dba_objects中會有相關分區表的記錄,但是dba_segements中不會有相關預先創建的分區表的記錄,也就是預先創建的分區表實際不會占用存儲空間。
***************************************
當參數deferred_segment_creation為true時
***************************************
SQL> show parameter segment
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
deferred_segment_creation boolean TRUE
rollback_segments string
transactions_per_rollback_segment integer 5
1.創建range分區表
CREATE TABLE tab_seg (ID number(20),datetime date) PARTITION BY RANGE (datetime)
(PARTITION P1 VALUES LESS THAN (TO_DATE('2018-11-1', 'YYYY-MM-DD')),
PARTITION P2 VALUES LESS THAN (TO_DATE('2018-12-1', 'YYYY-MM-DD')),
PARTITION P3 VALUES LESS THAN (TO_DATE('2019-1-1', 'YYYY-MM-DD')),
PARTITION P4 VALUES LESS THAN (TO_DATE('2019-2-1', 'YYYY-MM-DD')),
PARTITION P5 VALUES LESS THAN (TO_DATE('2019-3-1', 'YYYY-MM-DD')),
PARTITION P6 VALUES LESS THAN (TO_DATE('2019-4-1', 'YYYY-MM-DD')),
PARTITION P7 VALUES LESS THAN (TO_DATE('2019-5-1', 'YYYY-MM-DD')),
PARTITION P8 VALUES LESS THAN (TO_DATE('2019-6-1', 'YYYY-MM-DD')),
PARTITION P9 VALUES LESS THAN (TO_DATE('2019-7-1', 'YYYY-MM-DD')),
PARTITION P10 VALUES LESS THAN (TO_DATE('2019-8-1', 'YYYY-MM-DD')),
PARTITION P11 VALUES LESS THAN (TO_DATE('2019-9-1', 'YYYY-MM-DD')),
PARTITION P12 VALUES LESS THAN (TO_DATE('2019-10-1', 'YYYY-MM-DD')),
PARTITION P13 VALUES LESS THAN (TO_DATE('2019-11-1', 'YYYY-MM-DD')),
PARTITION P14 VALUES LESS THAN (TO_DATE('2019-12-1', 'YYYY-MM-DD')),
PARTITION P15 VALUES LESS THAN (TO_DATE('2020-1-1', 'YYYY-MM-DD')),
PARTITION P16 VALUES LESS THAN (TO_DATE('2020-2-1', 'YYYY-MM-DD')),
PARTITION P17 VALUES LESS THAN (MAXVALUE));
2.插入數據
declare
i number;
dd date;
BEGIN
dd := sysdate;
i:= 0;
for x in 1..5000 loop
--if mod(i,100)=0 then
insert into tab_seg(id,datetime) values(i,dd);
dd := dd+1/12;
i := i+1;
end loop;
END;
/
3.查詢有數據插入的P15分區
SQL> select * from dba_objects where SUBOBJECT_NAME='P15'
OWNER OBJECT_NAME SUBOBJECT_NAME OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE CREATED LAST_DDL_TIME TIMESTAMP STATUS T G S NAMESPACE EDITION_NAME
------------------------------ -------------------- ------------------------------ ---------- -------------- ------------------- ------------------ ------------------ ------------------- ------- - - - ---------- ------------------------------
DAYU TAB_SEG P15 87258 87258 TABLE PARTITION 22-OCT-18 22-OCT-18 2018-10-22:18:52:37 VALID N N N 1
SQL> select bytes from dba_segments where PARTITION_NAME='P15';
BYTES
----------
8388608
4.查詢沒有數據插入的P16分區
SQL> select * from dba_objects where SUBOBJECT_NAME='P16';
OWNER OBJECT_NAME SUBOBJECT_NAME OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE CREATED LAST_DDL_TIME TIMESTAMP STATUS T G S NAMESPACE EDITION_NAME
------------------------------ -------------------- ------------------------------ ---------- -------------- ------------------- ------------------ ------------------ ------------------- ------- - - - ---------- ------------------------------
DAYU TAB_SEG P16 87259 87259 TABLE PARTITION 22-OCT-18 22-OCT-18 2018-10-22:18:52:37 VALID N N N 1
SQL> select BYTES from dba_segments where PARTITION_NAME='P16';
no rows selected
5.結論:當deferred_segment_creation為true時,未插入數據的分區在dba_objects會有有相應的記錄,但是在dba_segments中沒有相應的記錄。
***************************************
當參數deferred_segment_creation為false時
***************************************
SQL> show parameter segment
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
deferred_segment_creation boolean FALSE
rollback_segments string
transactions_per_rollback_segment integer 5
SQL>
1.創建range分區表
CREATE TABLE tab_seg (ID number(20),datetime date) PARTITION BY RANGE (datetime)
(PARTITION P1 VALUES LESS THAN (TO_DATE('2018-11-1', 'YYYY-MM-DD')),
PARTITION P2 VALUES LESS THAN (TO_DATE('2018-12-1', 'YYYY-MM-DD')),
PARTITION P3 VALUES LESS THAN (TO_DATE('2019-1-1', 'YYYY-MM-DD')),
PARTITION P4 VALUES LESS THAN (TO_DATE('2019-2-1', 'YYYY-MM-DD')),
PARTITION P5 VALUES LESS THAN (TO_DATE('2019-3-1', 'YYYY-MM-DD')),
PARTITION P6 VALUES LESS THAN (TO_DATE('2019-4-1', 'YYYY-MM-DD')),
PARTITION P7 VALUES LESS THAN (TO_DATE('2019-5-1', 'YYYY-MM-DD')),
PARTITION P8 VALUES LESS THAN (TO_DATE('2019-6-1', 'YYYY-MM-DD')),
PARTITION P9 VALUES LESS THAN (TO_DATE('2019-7-1', 'YYYY-MM-DD')),
PARTITION P10 VALUES LESS THAN (TO_DATE('2019-8-1', 'YYYY-MM-DD')),
PARTITION P11 VALUES LESS THAN (TO_DATE('2019-9-1', 'YYYY-MM-DD')),
PARTITION P12 VALUES LESS THAN (TO_DATE('2019-10-1', 'YYYY-MM-DD')),
PARTITION P13 VALUES LESS THAN (TO_DATE('2019-11-1', 'YYYY-MM-DD')),
PARTITION P14 VALUES LESS THAN (TO_DATE('2019-12-1', 'YYYY-MM-DD')),
PARTITION P15 VALUES LESS THAN (TO_DATE('2020-1-1', 'YYYY-MM-DD')),
PARTITION P16 VALUES LESS THAN (TO_DATE('2020-2-1', 'YYYY-MM-DD')),
PARTITION P17 VALUES LESS THAN (MAXVALUE));
2.插入數據
declare
i number;
dd date;
BEGIN
dd := sysdate;
i:= 0;
for x in 1..5000 loop
--if mod(i,100)=0 then
insert into tab_seg(id,datetime) values(i,dd);
dd := dd+1/12;
i := i+1;
end loop;
END;
/
3.查詢有數據插入的P15分區
SQL>select * from dba_objects where SUBOBJECT_NAME='P15'
OWNER OBJECT_NAME SUBOBJECT_NAME OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE CREATED LAST_DDL_TIME TIMESTAMP STATUS T G S NAMESPACE EDITION_NAME
------------------------------ -------------------- ------------------------------ ---------- -------------- ------------------- ------------------ ------------------ ------------------- ------- - - - ---------- ------------------------------
DAYU TAB_SEG P15 87280 87280 TABLE PARTITION 22-OCT-18 22-OCT-18 2018-10-22:19:03:02 VALID N N N 1
SQL> select bytes from dba_segments where PARTITION_NAME='P15';
BYTES
----------
8388608
4.查詢沒有數據插入的P16分區
SQL> select * from dba_objects where SUBOBJECT_NAME='P16';
OWNER OBJECT_NAME SUBOBJECT_NAME OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE CREATED LAST_DDL_TIME TIMESTAMP STATUS T G S NAMESPACE EDITION_NAME
------------------------------ -------------------- ------------------------------ ---------- -------------- ------------------- ------------------ ------------------ ------------------- ------- - - - ---------- ------------------------------
DAYU TAB_SEG P16 87281 87281 TABLE PARTITION 22-OCT-18 22-OCT-18 2018-10-22:19:03:02 VALID N N N 1
SQL> select bytes from dba_segments where PARTITION_NAME='P16';
BYTES
----------
8388608
5.結論:當deferred_segment_creation為false時,未插入數據的分區在dba_objects會有有相應的記錄,在dba_segments也會預先分配空間,有相應的記錄。