IT貓撲網(wǎng):您身邊最放心的安全下載站! 最新更新|軟件分類|軟件專題|手機版|論壇轉(zhuǎn)貼|軟件發(fā)布

您當(dāng)前所在位置: 首頁數(shù)據(jù)庫Oracle → Oracle分區(qū)表和索引

Oracle分區(qū)表和索引

時間: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)閱讀

文章評論
發(fā)表評論

熱門文章 Oracle中使用alter table來增加,刪除,修改列的語法 Oracle中使用alter table來增加,刪除,修改列的語法 oracle中使用SQL語句修改字段類型-oracle修改SQL語句案例 oracle中使用SQL語句修改字段類型-oracle修改SQL語句案例 誤刪Oracle數(shù)據(jù)庫實例的控制文件 誤刪Oracle數(shù)據(jù)庫實例的控制文件 為UNIX服務(wù)器設(shè)置Oracle全文檢索 為UNIX服務(wù)器設(shè)置Oracle全文檢索

相關(guān)下載

    人氣排行 oracle中使用SQL語句修改字段類型-oracle修改SQL語句案例 Oracle中使用alter table來增加,刪除,修改列的語法 ORACLE SQL 判斷字符串是否為數(shù)字的語句 ORACLE和SQL語法區(qū)別歸納(1) oracle grant 授權(quán)語句 ORACLE修改IP地址后如何能夠使用 如何加速Oracle大批量數(shù)據(jù)處理 Oracle刪除表的幾種方法