oracle分區怎麼使用
1.什麼是分區
分區的實質是把一張大表的數據按照某種規則使用多張子表來存儲。然後這多張子表使用統一的表名對外提供服務,子表實際對用戶不可見。類似於在多張子表上建立一個視圖,然後用戶直接使用該視圖來訪問數據。
2.為什麼要使用分區
當一張表的數據量到達上億行的時候,表的性能會嚴重降低,這個時候就需要用到分區了,通過劃分成多個小表,並在每個小表上建立本地索引可以大大縮小索引數據文件的大小,從而更快的定位到目標數據來提升訪問性能。
分區除了可以用來提升訪問性能外,還因為可以指定分區所使用的表空間,因此也用來做數據的生命周期管理。當前需要頻繁使用的活躍數據可以放到訪問速度更快但價格也更貴的存儲設備上,而2、3年前的歷史數據,或者叫冷數據可以放到更廉價、速度更低的設備上。從而降低存儲費用。
3.簡單分區
常用的分區方法有RANGE、HASH、LIST 3 種。
range分區通常用來對時間或數字進行分區,list分區用來把不相關的數據組織到一起,hash讓數據均勻的分布到各個分區中。另外為了方便對範圍分區進行管理,oracle還提供了range分區的增強類型interval(間隔)分區,當有新寫入的數據的分區值超過了當前分區範圍的最大值的時候,它會以分區範圍的當前最大值為基數,以指定的interval 為區間,自動創建一個新分區,具體使用案例見下文。
範圍分區語法圖
列表分區語法圖
individual_hash_partitions::=
hash_partitions_by_quantity::=
案例:
想想這樣一種情況:假設我們需要對某張表按月為單位進行分區,也許我們可以提前建好近1年的分區,但是1年的時間一過,我們就需要再添加分區了,如果沒有每天定時查看分區數是否足夠的話,那麼就會因為分區不存在而報錯,如果使用間隔分區表的話,dbms會根據分區欄位的值自動添加分區。
如下例,建表的時候指定了5個分區,且分區間隔為1年,目前庫裡面最大的分區p2020的邊界是少於2021-01-01日(範圍分區的指定範圍為左閉右開,即邊界不包括values less than指定的值)
create table RANGE_INTERVAL(id int, name varchar2(500), update_time date)
partition by range(update_time)
interval (numtoyminterval(1,'year') )
(partition p2016 values less than (to_date('2017-01-01','yyyy-mm-dd')) compress for oltp tablespace che_data pctfree 5,
partition p2017 values less than (to_date('2018-01-01','yyyy-mm-dd')) compress for oltp pctfree 5,
partition p2018 values less than (to_date('2019-01-01','yyyy-mm-dd')) compress for oltp pctfree 5,
partition p2019 values less than (to_date('2020-01-01','yyyy-mm-dd')) compress for oltp pctfree 5,
partition p2020 values less than (to_date('2021-01-01','yyyy-mm-dd')) compress for oltp
);
表建好之後,我們看一下dbms的元數據,一個5個分區,且都不是間隔分區
insert into RANGE_INTERVAL
select 1, 'xixi' name , sysdate + interval '1' year from dual;
插入數據後,再次查看dbms的元數據
可以看到多了一個分區。
4.二級分區
二級分區是可以在分區里再次根據指定的欄位劃分子分區,range、hash、list這三種分區類型可以兩兩組合形成二級分區,也可以和自己組合形成二級分區。
混合範圍分區::=
混合列表分區::=
混合hash分區::=
子分區語法圖
範圍子分區語法圖
列表子分區語法圖
hash子分區語法圖
4.1hash-hash二級分區使用示例
create table PPU_CELLPHONE_BAK partition by hash (data_source_id) subpartition by hash(ENCRYPT_ID )
subpartitions 5 partitions 6