按時間分區自動建分區表


在oracle11以前,分區維護需要手工維護,就是要手工建表分區。oracle11以后,就可以自動建時間分區了。

1、查看oracle 的版本號

select * from v$version;
我的oracle是11,支持自動建分區,查詢結果如下:
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

2、用分區建表

(1)partition by range (CREATE_DATE) interval (numtoyMinterval (1,'MONTH'))根據CREATE_DATE自動按月建分區

create table T_ZNF
(
  ID          NUMBER(24) not null,
  CREATE_DATE DATE,
  STATE       VARCHAR2(10),
  T_DESC      VARCHAR2(255)
) tablespace TBS_APP_LOG --指定表空間(如果在下面的建分區時,指定表空間,后面自動建的分區表空間還是系統給的)
partition by range (CREATE_DATE) interval (numtoyMinterval (1,'MONTH'))(
  partition T_LOGTIME_main values less than (TO_DATE(' 2018-02-28 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
);

 

插入數據

自動在指標的表空間下建立了分區表

 

按日自動建分區

 1 create table MEAP_LOG
 2 (
 3   LOGID     VARCHAR2(32) not null,
 4   LOGINNAME VARCHAR2(32),
 5   AREA      VARCHAR2(32),
 6   LOGTYPE   VARCHAR2(32) not null,
 7   MESSAGE   VARCHAR2(4000),
 8   DETAIL    CLOB,
 9   LOGTIME   DATE not null
10 )tablespace TBS_APP_LOG
11 partition by range (LOGTIME) INTERVAL(NUMTODSINTERVAL(1,'DAY'))
12 (
13   partition T_LOGTIME_main values less than (TO_DATE(' 2018-2-28 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
14     
15 );

 

 

 (2)

-- Create table
create table T_ZNF
(
  ID          NUMBER(24) not null,
  CREATE_DATE DATE,
  STATE       VARCHAR2(10),
  T_DESC      VARCHAR2(255)
)
partition by range (CREATE_DATE)
(
  partition T_ZNF_201702 values less than (TO_DATE(' 2017-02-28 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    tablespace TBS_ISAP
);
-- Create/Recreate primary, unique and foreign key constraints 
alter table T_ZNF
  add constraint PK_T_ZNF_ID primary key (ID)
  using index 
  tablespace TBS_ISAP;
-- Create/Recreate indexes 
create index IDX_T_ZNF_CREATE_DATE on T_ZNF (CREATE_DATE)
  tablespace TBS_ISAP;
  • 時間函數numtodsinterval和numtoyminterval:
兩個函數都是時間的增加函數,只是增減的對象不一樣(減是在數字前加符號‘-’)。
numtodsinterval:MONTH|YEAR;
numtoyminterval:DAY|HOUR|MINUTE|SECOND;
另:numtodsinterval 增減月份時和add_months函數相似,都是增減一個月,但有所不同。
numtodsinterval :2.28 增減月份后,日期是該月的28號, 如果該月對應的日期不存在,就會拋異常。如 計算后日期為2月30日,就會拋異常。
add_months:2.28 增減月份后,日期是該月的月底。
select  add_months(to_date('2007-02-28','yyyy-mm-dd'),1) from dual;--2007/3/31
select  add_months(to_date('2007-02-05','yyyy-mm-dd'),-1) from dual;--2007/1/5
select to_date('2007-02-28','yyyy-mm-dd')+numtoyminterval(12,'MONTH') from dual; --2008/2/28
select to_date('2007-01-30','yyyy-mm-dd')+numtoyminterval(1,'MONTH') from dual; --報錯

 

 

 

  • interval
根據年: INTERVAL(NUMTOYMINTERVAL(1,'YEAR'))
根據月: INTERVAL(NUMTOYMINTERVAL(1,'MONTH'))
根據天: INTERVAL(NUMTODSINTERVAL(1,'DAY'))
根據時分秒: NUMTODSINTERVAL( n, { 'DAY'|'HOUR'|'MINUTE'|'SECOND'})  
 
3、插入數據,驗證是否自動建分區
插入如下數據
 
查看表的分區,發現表自動新建4個分區:SYS_P661、SYS_P662、SYS_P663、SYS_P664

3、表分區的查詢

用表分區建表,以前的查詢方式還是可以用的,但是用分區表查詢效率更高。

查看分區的大小

SELECT *  FROM dba_segments t WHERE t.segment_name ='T_ZNF';

4、表分區的刪除

刪除分區表時,加 update global indexes 或者update indexes ,否則索引和表失效。

alter table t_znf truncate partition SYS_P663 update global indexes;--刪除表分區的數據,表分區仍舊存在
alter table t_znf drop partition SYS_P663 update global indexes; --刪除表分區及其數據

update global indexes 或者update indexes,就是重建索引。

下面我們不加 update global indexes 或者update indexes 刪除一下表分區。

查看索引的狀態
select status ,index_name,A.* from user_indexes A where index_name IN ('PK_T_ZNF_ID','IDX_T_ZNF_CREATE_DATE');

 執行刪除表空間數據的語句
alter table t_znf truncate partition  SYS_P662;
再查看索引的狀態,索引失效了
插入數據報錯
進行表分析和索引分析時,也會報錯
--表分析
  analyze table T_ZNF compute statistics;
--索引分析
analyze index PK_T_ZNF_ID compute statistics;
需將兩個索引進行重建,索引和表才能正常使用。
alter index IDX_T_ZNF_CREATE_DATE rebuild /*online*/ tablespace TBS_ISAP;
將兩個所以重建后,索引狀態為VALID,數據也可以正常插入。
 

 

 

 

 


免責聲明!

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



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