時間:2015-06-28 00:00:00 來源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評論(13)
什么時候使用分區(qū):
1、 大數(shù)據(jù)量的表,比如大于2GB。一方面2GB文件對于32位os是一個上限,另外備份時間長。
2、 包括歷史數(shù)據(jù)的表,比如最新的數(shù)據(jù)放入到最新的分區(qū)中。典型的例子:歷史表,只有當(dāng)前月份的數(shù)據(jù)可以被修改,而其他月份只能read-only
ORACLE只支持以下分區(qū):tables, indexes on tables, materialized views, and indexes on materialized views
分區(qū)對SQL和DML是透明的(應(yīng)用程序不必知道已經(jīng)作了分區(qū)),但是DDL可以對不同的分區(qū)進行管理。
不同的分區(qū)之間必須有相同的邏輯屬性,比如共同的表名,列名,數(shù)據(jù)類型,約束;
但是可以有不同的物理屬性,比如pctfree, pctused, and tablespaces.
分區(qū)獨立性:即使某些分區(qū)不可用,其他分區(qū)仍然可用。
最多可以分成64000個分區(qū),但是具有LONG or LONG RAW列的表不可以,但是有CLOB or BLOB列的表可以。
可以不用to_date函數(shù),比如:
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的
非分區(qū)的表可以有分區(qū)或者非分區(qū)的索引;
分區(qū)表可以有分區(qū)或者非分區(qū)的索引;
Partitioning 方法:
Range Partitioning
List Partitioning
Hash Partitioning
Composite Partitioning
Composite Partitioning:組合,以及 range-hash and range-list composite partitioning
Range Partitioning:
每個分區(qū)都有VALUES LESS THAN子句,表示這個分區(qū)小于(<)某個上限,而大于等于(>=)前一個分區(qū)的VALUES LESS THAN值。
MAXVALUE定義最高的分區(qū),他表示一個虛擬的無限大的值。這個分區(qū)包括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)
);
插入數(shù)據(jù):
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);
選擇數(shù)據(jù):
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);
按照多個列分區(qū):
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);
如果多個分區(qū)列的值沖突,則按照從左到右的優(yōu)先級。
List Partitioning:
可以組織無序的,或者沒有關(guān)系的數(shù)據(jù)在相同的分區(qū)。
不支持多列的(multicolumn) partition keys,只能是一個列。
DEFAULT表示不滿足條件的都放在這個分區(qū)。
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)
);
#p#副標(biāo)題#e#
Hash Partitioning:
不可以作splitting, dropping or merging操作。但是可以added and coalesced.
當(dāng)我們無法判斷有多少數(shù)據(jù)映射或者怎樣映射到各個分區(qū)時,可以使用這種方法。分區(qū)數(shù)據(jù)最好是2的冪,這樣可以平均分配數(shù)據(jù)。
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分區(qū),每個子分區(qū)又按照list or hash分區(qū)。
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) --子分區(qū)
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會這樣命名子分區(qū):分區(qū)_子分區(qū),比如sales_jan2000_sp1表示將數(shù)據(jù)放在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,
SUB
關(guān)鍵詞標(biāo)簽:Oracle
相關(guān)閱讀
熱門文章 Oracle中使用alter table來增加,刪除,修改列的語法 oracle中使用SQL語句修改字段類型-oracle修改SQL語句案例 誤刪Oracle數(shù)據(jù)庫實例的控制文件 為UNIX服務(wù)器設(shè)置Oracle全文檢索
人氣排行 oracle中使用SQL語句修改字段類型-oracle修改SQL語句案例 Oracle中使用alter table來增加,刪除,修改列的語法 ORACLE SQL 判斷字符串是否為數(shù)字的語句 ORACLE和SQL語法區(qū)別歸納(1) oracle grant 授權(quán)語句 ORACLE修改IP地址后如何能夠使用 如何加速Oracle大批量數(shù)據(jù)處理 Oracle刪除表的幾種方法