Oracle 參數之deferred_segment_creation的測試


 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也會預先分配空間,有相應的記錄。

 


免責聲明!

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



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