什麼時候使用分區

    1、 大數據量的表,比如大於2GB。一方面2GB文件對於32位os是一個上限,另外備份時間長。

  2、 包括歷史數據的表,比如最新的數據放入到最新的分區中。典型的例子:歷史表,只有當前月份的數據可以被修改,而其他月份只能read-only

  ORACLE只支持以下分區:tables, indexes on tables, materialized views, and indexes on materialized views

  分區對SQL和DML是透明的(應用程序不必知道已經作了分區),但是DDL可以對不同的分區進行管理。

  不同的分區之間必須有相同的邏輯屬性,比如共同的表名,列名,數據類型,約束;

  但是可以有不同的物理屬性,比如pctfree, pctused, and tablespaces.

  分區獨立性:即使某些分區不可用,其他分區仍然可用。

  最多可以分成64000個分區,但是具有LONG or LONG RAW列的表不可以,但是有CLOB or BLOB列的表可以。

  可以不用to_date函數,比如:

  alter session set nls_date_format='mm/dd/yyyy';

  CREATE TABLE sales_range

  (salesman_id NUMBER(5),

  salesman_name VARCHAR2(30),

  sales_amount NUMBER(10),

  sales_date DATE)

  PARTITION BY RANGE(sales_date)

  (

  PARTITION sales_jan2000 VALUES LESS THAN('02/01/2000'),

  PARTITION sales_feb2000 VALUES LESS THAN('03/01/2000'),

  PARTITION sales_mar2000 VALUES LESS THAN('04/01/2000'),

  PARTITION sales_apr2000 VALUES LESS THAN('05/01/2000')

  );

  Partition Key:最多16個columns,可以是nullable的

  非分區的表可以有分區或者非分區的索引;

  分區表可以有分區或者非分區的索引;

  Partitioning 方法:

  Range Partitioning

  List Partitioning

  Hash Partitioning

  Composite Partitioning

  Composite Partitioning:組合,以及 range-hash and range-list composite partitioning

  Range Partitioning:

  每個分區都有VALUES LESS THAN子句,表示這個分區小於(<)某個上限,而大於等於(>=)前一個分區的VALUES LESS THAN值。

  MAXVALUE定義最高的分區,他表示一個虛擬的無限大的值。這個分區包括null值。

  CREATE TABLE sales_range

  (salesman_id NUMBER(5),

  salesman_name VARCHAR2(30),

  sales_amount NUMBER(10),

  sales_date DATE)

  PARTITION BY RANGE(sales_date)

  (

  PARTITION sales_jan2000 VALUES LESS THAN(TO_DATE('01/02/2000','DD/MM/YYYY')),

  PARTITION sales_feb2000 VALUES LESS THAN(TO_DATE('01/03/2000','DD/MM/YYYY')),

  PARTITION sales_mar2000 VALUES LESS THAN(TO_DATE('01/04/2000','DD/MM/YYYY')),

  PARTITION sales_apr2000 VALUES LESS THAN(TO_DATE('01/05/2000','DD/MM/YYYY')),

  PARTITION sales_2000 VALUES LESS THAN(MAXVALUE)

  );

  插入數據:

  Insert into sales_range values(1,2,3,to_date('21-04-2000','DD-MM-YYYY'));

  Insert into sales_range values(1,2,3,sysdate);

  選擇數據:

  select * from sales_range;

  select * from sales_range partition(sales_apr2000);

  select * from sales_range partition(sales_mar2000);

  select * from sales_range partition(sales_2000);

  按照多個列分區:

  CREATE TABLE sales_range1

  (salesman_id NUMBER(5),

  salesman_name VARCHAR2(30),

  sales_amount NUMBER(10),

  sales_date DATE)

  PARTITION BY RANGE(sales_date, sales_amount)

  (

  PARTITION sales_jan2000 VALUES LESS THAN(TO_DATE('01/02/2000','DD/MM/YYYY'),1000),

  PARTITION sales_feb2000 VALUES LESS THAN(TO_DATE('01/03/2000','DD/MM/YYYY'),2000),

  PARTITION sales_mar2000 VALUES LESS THAN(TO_DATE('01/04/2000','DD/MM/YYYY'),3000),

  PARTITION sales_apr2000 VALUES LESS THAN(TO_DATE('01/05/2000','DD/MM/YYYY'),4000),

  PARTITION sales_2000 VALUES LESS THAN(MAXVALUE, MAXVALUE)

  );

  Insert into sales_range1 values(1,2,500, TO_DATE('21/01/2000','DD/MM/YYYY'));

  Insert into sales_range1 values(2,3,1500, sysdate);

  如果多個分區列的值衝突,則按照從左到右的優先級。

  List Partitioning:

  可以組織無序的,或者沒有關係的數據在相同的分區。

  不支持多列的(multicolumn) partition keys,只能是一個列。

  DEFAULT表示不滿足條件的都放在這個分區。

  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'),

  PARTITION sales_east VALUES ('New York', 'Virginia', 'Florida'),

  PARTITION sales_central VALUES('Texas', 'Illinois'),

  PARTITION sales_other VALUES(DEFAULT)

  );

  Hash Partitioning:

  不可以作splitting, dropping or merging操作。但是可以added and coalesced.

  當我們無法判斷有多少數據映射或者怎樣映射到各個分區時,可以使用這種方法。分區數據最好是2的冪,這樣可以平均分配數據。

  CREATE TABLE sales_hash1

  (salesman_id NUMBER(5),

  salesman_name VARCHAR2(30),

  sales_amount NUMBER(10),

  week_no NUMBER(2))

  PARTITION BY HASH(salesman_id)

  PARTITIONS 4

  STORE IN (users, TOOLS, TEST, TABLESPACE1);  --表空間

  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)

  (

  PARTITION p1 tablespace users,

  PARTITION p2 tablespace system

  );

  Composite Partitioning:

  先按照range分區,每個子分區又按照list or hash分區。

  CREATE TABLE sales_composite

  (salesman_id NUMBER(5),

  salesman_name VARCHAR2(30),

  sales_amount NUMBER(10),

  sales_date DATE)

  PARTITION BY RANGE(sales_date)

  SUBPARTITION BY HASH(salesman_id)  --子分區

  SUBPARTITION TEMPLATE(

  SUBPARTITION sp1 TABLESPACE data1,

  SUBPARTITION sp2 TABLESPACE data2,

  SUBPARTITION sp3 TABLESPACE data3,

  SUBPARTITION sp4 TABLESPACE data4)

  (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'))

  PARTITION sales_may2000 VALUES LESS THAN(TO_DATE('06/01/2000','DD/MM/YYYY')));

  使用TEMPLATE,oracle會這樣命名子分區:分區_子分區,比如sales_jan2000_sp1表示將數據放在data1表空間

  Range-list:

  CREATE TABLE bimonthly_regional_sales

  (deptno NUMBER,

  item_no VARCHAR2(20),

  txn_date DATE,

  txn_amount NUMBER,

  state VARCHAR2(2))

  PARTITION BY RANGE (txn_date)

  SUBPARTITION BY LIST (state)

  SUBPARTITION TEMPLATE(

  SUBPARTITION east VALUES('NY', 'VA', 'FL') TABLESPACE system,

  SUBPARTITION west VALUES('CA', 'OR', 'HI') TABLESPACE users,

  SUBPARTITION central VALUES('IL', 'TX', 'MO') TABLESPACE tools)

  ( PARTITION janfeb_2000 VALUES LESS THAN (TO_DATE('1-03-2000','DD-Mm-YYYY')), PARTITION marapr_2000 VALUES LESS THAN (TO_DATE('1-05-2000','DD-Mm-YYYY')), PARTITION mayjun_2000 VALUES LESS THAN (TO_DATE('1-07-2000','DD-Mm-YYYY')) );

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章