ORACLE 各種PARTITION 的分析 原

2021-09-01 16:48:33 字數 4593 閱讀 2577

oracle 為構建資料倉儲提供了4種型別的分割槽方法:range partition ,hash partition ,list partition,composite partition.

下面我分別對這四種分割槽方法的概念,他們的使用場景,以及各種分割槽方法做乙個效能比較。

一:概念

1:range partitioning

這是最常用的一種分割槽方法,基於column的值範圍做分割槽,最常見的是基於時間欄位的資料的範圍的分割槽,比如:對於sale表,可以對銷售時間按照月份做乙個range partitioning。這種分割槽在資料倉儲裡用的比較多,以下是create statment

create table sales_range

(salesman_id number(5),

salesman_name varchar2(30),

sales_amount number(10),

sales_date date)

compress

partition by range(sales_date)

(partition sales_jan2000 values less than(to_date('02/01/2000','dd/mm/yyyy')),

partition sales_feb2000 values less than(to_date('03/01/2000','dd/mm/yyyy')),

partition sales_mar2000 values less than(to_date('04/01/2000','dd/mm/yyyy')),

partition sales_apr2000 values less than(to_date('05/01/2000','dd/mm/yyyy')));

對於compress關鍵字的理解,將在後續的壓縮分割槽講到

2;hash partitioning

hash partitioning對映資料到基於hash演算法的分割槽上,hash演算法將應用你指定的分割槽關鍵字,平均的分那些在partitions中的行。給每乙個分割槽近似相同的大小,要保證資料能平均分配,分割槽數一般是2n。比如說,需要insert sales_hash 一條資料,oracle會通過hash演算法處理salesman_id,然後找到對於的分割槽表進行insert。hash partitioning 是為跨越裝置的分布式資料提供了一種理想的方法,hash演算法也很容易轉化成range分割槽方法,特別是當被分割槽的資料不是歷史資料時。

create table sales_hash

(salesman_id number(5),

salesman_name varchar2(30),

sales_amount number(10),

week_no number(2))

partition by hash(salesman_id)

partitions 4;

3:list partitioning

list partitioning能夠讓你明確的控制有多少行被分割槽,你能對要分割槽的column上明確的指定按照那些具體的值來分割槽,這種方式在range和hash方式是做不到的。這種方式的優點是,你能組織和分組那些沒有順序和沒有關係的資料集。下面是通過銷售地區做乙個list分割槽表。

create table sales_list

(salesman_id number(5),

salesman_name varchar2(30),

sales_state varchar2(20),

sales_amount number(10),

sales_date date)

partition by list(sales_state)

(partition sales_west values('california', 'hawaii') compress,

partition sales_east values('new york', 'virginia', 'florida'),

partition sales_central values('texas', 'illinois'));

4:composite partitioning

composite partitioning 是把range ,hash ,list 分割槽方式組合起來的分割槽方式。

比如composite range-hash partitioning和composite range-list partitioning:

create table sales_range_hash(

s_productid number,

s_saledate date,

s_custid number,

s_totalprice number)

partition by range (s_saledate)

subpartition by hash (s_productid) subpartitions 8

(partition sal99q1 values less than (to_date('01-apr-1999', 'dd-mon-yyyy')),

partition sal99q2 values less than (to_date('01-jul-1999', 'dd-mon-yyyy')),

partition sal99q3 values less than (to_date('01-oct-1999', 'dd-mon-yyyy')),

partition sal99q4 values less than (to_date('01-jan-2000', 'dd-mon-yyyy')));

另外你還可以用subpartition template的方式指定:

create table sales_range_hash(

s_productid number,

s_saledate date,

s_custid number,

s_totalprice number)

partition by range (s_saledate)

subpartition by hash (s_productid)

subpartition template(

subpartition sp1 tablespace tbs1,

subpartition sp2 tablespace tbs2,

subpartition sp3 tablespace tbs3,

subpartition sp4 tablespace tbs4,

subpartition sp5 tablespace tbs5,

subpartition sp6 tablespace tbs6,

subpartition sp7 tablespace tbs7,

subpartition sp8 tablespace tbs8)

(partition sal99q1 values less than (to_date('01-apr-1999', 'dd-mon-yyyy')),

partition sal99q2 values less than (to_date('01-jul-1999', 'dd-mon-yyyy')),

partition sal99q3 values less than (to_date('01-oct-1999', 'dd-mon-yyyy')),

partition sal99q4 values less than (to_date('01-jan-2000', 'dd-mon-yyyy')));

這樣,沒有子分割槽通過的hash分割槽將會統一到不同的表空間。

二:使用各種分割槽方法的場景

1:什麼時候用range partition

range partition是一種方便的方法分割槽歷史的資料,經常在date colmun通過時間間隔組織資料。比如說:你要查詢2023年8月的資料,查詢將直接找到2023年8月的分割槽,避免了大量不必要的資料掃瞄。

在處理週期性的load新資料和purge老資料的時候,range partition也是乙個理想的選擇。

應用場景:

a)有乙個大表需要通過時間字段頻繁的訪問,通過這個時間欄位做rang partition 有利於做分割槽裁剪。

b)如果你不能對乙個大表在指定的時間內做備份或restore,你可以通過range把他們分成小的logic片來做。

2:什麼時候用hash partition

hash partition不是乙個很好的管理歷史的方法。

應用場景

a)增加大表的可用性。

b)避免各個分割槽之間查詢資料,並且各個分割槽可以放在不同的裝置上,達到最大的i0吞吐量。也可以用store in 子句分配每個分割槽到不同的表空間。

3:什麼時候用list partition

如果你想對映資料到離散的值的時候,list partition是個比較好的選擇。

4:什麼時候用composite range-hash partitioning

這是range和hash的組合使用,先對錶用range分,然後對每個range再做hash分割槽。

由於做了range後的子分割槽是沒有規律的,如果在資料倉儲設計時候,通過查詢需求覺得有必要再細分,可以考慮使用。oracle會把子分割槽又分成不同的segment

mapreduce設定分割槽partition

在執行mr程式時我們可能想要將不同的資料放到不同的檔案中。比如說想要將相同省份的資訊放到乙個檔案中,不同省份的資訊放在不同的檔案中。這個時候如果有多個reduce的話就可以將相同的省份放到同乙個reduce中,這樣就可以將相同的省份放到同乙個檔案中。partition是在map階段完成後執行的。將分...

Spark core之分割槽器Partitioner

spark中有兩種分割槽器 hashpartitioner和rangepartitioner,分別用於根據rdd中key的hashcode值進行分割槽以及根據範圍進行資料分割槽,預設hashpartitioner。def main args array string unit printinfo s...

oracle 各種授權

alter any cluster 修改任意簇的許可權 alter any index 修改任意索引的許可權 alter any role 修改任意角色的許可權 alter any sequence 修改任意序列的許可權 alter any snapshot 修改任意快照的許可權 alter any...