PLSQL_性能優化系列09_Oracle Partition Table數據分區表

2014-08-22 Created By BaoXinjianlinux

1、摘要數據庫


一、分區表:併發

    隨着表的不斷增大,對於新紀錄的增長、查找、刪除等(DML)的維護也更加困難。對於數據庫中的超大型表,可經過把它的數據分紅若干個小表,從而簡化數據庫的管理活動。對於每個簡化後的小表,咱們稱爲一個單個的分區oracle

    對於分區的訪問,咱們不須要使用特殊的SQL查詢語句或特定的DML語句,並且能夠單獨的操做單個分區,而不是整個表。同時能夠將不一樣分區的數據放置到不 同的表空間,好比將不一樣年份的銷售數據,存放在不一樣的表空間,即年的銷售數據存放到TBS_2001,2002年的銷售數據存放到TBS_2002,依次 類推,從而實現了分散存儲,這將大大的簡化大容量表的管理,提升查詢性能及I/O併發等。app

    對於外部應用程序來講,雖然存在不一樣的分區,且數據位於不一樣的表空間,但邏輯上仍然是一張表高併發

    可使用SQL*Loader,IMPDP,EXPDP,Import,Export等工具來裝載或卸載分區表中的數據工具

    關於分區表的功能實際上同SQL server 中的分區表是一樣的概念,只不過SQL server中的數據存放到了文件組,至關於Oracle概念中的表空間性能

    分區信息管控表:DBA_TAB_SUBPARTITIONS測試

 

二、什麼時候分區ui

    當表達到GB大小且繼續增加

    須要將歷史數據和當前的數據分開單獨處理,好比歷史數據僅僅須要只讀,而當前數據則實現DML

 

三、分區的條件及特性

  • 共性:不一樣的分區之間必須有相同的邏輯屬性,好比表名,列名,數據類型,約束等,
  • 個性:各個分區能夠有不一樣的物理屬性,好比pctfree, pctused, and tablespaces.
  • 分區獨立性:即便某些分區不可用,其餘分區仍然可用。
  • 特殊性:含有LONG、LONGRAW數據類型的表不能進行分區

 

四、分區的優勢

  • 提升查詢性能:只須要搜索特定分區,而非整張表,提升查詢速度
  • 節約維護時間:單個分區的數據裝載,索引重建,備份,維護等將遠小於整張表的維護時間。
  • 節約維護成本:能夠單獨備份和恢復每一個分區
  • 均衡I/O:將不一樣的分區映射到不一樣的磁盤以平衡I/O,提升併發

 

五、分區表類型

  • 範圍分區表
  • 列表分區表
  • 哈希分區表
  • 組合分區表

 

六、 分區索引類型

  • 全局索引
  • 全局分區索引
  • 本地分區索引

 

七、 分區表創建四種方式語法

(1)、範圍分區表

CREATE TABLE range_example ( range_key_column DATE, DATA VARCHAR2 (20), ID INTEGER ) PARTITION BY RANGE (range_key_column) (PARTITION part01 VALUES LESS THAN (TO_DATE ('2008-07-1 00:00:00', 'yyyy-mm-dd hh24:mi:ss')) TABLESPACE tbs01, PARTITION part02 VALUES LESS THAN (TO_DATE ('2008-08-1 00:00:00', 'yyyy-mm-dd hh24:mi:ss')) TABLESPACE tbs02, PARTITION part03 VALUES LESS THAN (TO_DATE ('2008-09-1 00:00:00', 'yyyy-mm-dd hh24:mi:ss')) TABLESPACE tbs03);

(2)、列表分區表

CREATE TABLE list_example (dname VARCHAR2 (10), DATA VARCHAR2 (20)) PARTITION BY LIST (dname) (PARTITION part01 VALUES ('ME', 'PE', 'QC', 'RD'), PARTITION part02 VALUES ('SMT', 'SALE'));

(3)、哈希分區表

CREATE TABLE hash_example ( hash_key_column DATE, DATA VARCHAR2 (20) ) PARTITION BY HASH (hash_key_cloumn) (PARTITION part01, PARTITION part02);

(4)、組合分區表

CREATE TABLE range_hash_example ( range_column_key DATE, hash_column_key INT, DATA VARCHAR2 (20) ) PARTITION BY RANGE (range_column_key) SUBPARTITION BY HASH (hash_column_key) SUBPARTITIONS 2 (PARTITION part_1 VALUES LESS THAN (TO_DATE ('2008-08-01', 'yyyy-mm-dd')) ( SUBPARTITION part_1_sub_1 , SUBPARTITION part_1_sub_2 , SUBPARTITION part_1_sub_3 ), PARTITION part_2 VALUES LESS THAN (TO_DATE ('2008-09-01', 'yyyy-mm-dd')) (SUBPARTITION part_2_sub_1 , SUBPARTITION part_2_sub_2 ));

 

八、 分區索引的結構圖

注:hash partitioned table 新增partition時,現有表的中全部data都有從新計算hash值,而後從新分配到分區中。因此被從新分配的分區的 indexes須要rebuild 。

 

2、案例 - 建立分區表


案例: 建立分區表bxj_emp,以性別區分數據分區方式,將資料分別存放兩個男女表空間中

1. 建立兩個表空空間

CREATE TABLESPACE bxj_emp_ts1 LOGGING DATAFILE '/opt/oracle/oradata/gavinsit/bxj_emp_data01.dbf' SIZE 32M AUTOEXTEND ON NEXT 32M MAXSIZE 2048M EXTENT MANAGEMENT LOCAL CREATE TABLESPACE bxj_emp_ts2 LOGGING DATAFILE '/opt/oracle/oradata/gavinsit/bxj_emp_data02.dbf' SIZE 32M AUTOEXTEND ON NEXT 32M MAXSIZE 2048M EXTENT MANAGEMENT LOCAL

 

2. 建立分區表,以sex欄位區分

CREATE TABLE bxj_emp_tb ( emp_id NUMBER, employeee_name VARCHAR (50),  sex VARCHAR (10), salary NUMBER ) PARTITION BY LIST (sex) (PARTITION bxj_emp_ts1 VALUES ('male'), PARTITION bxj_emp_ts2 VALUES ('female'));

 

3. 創建測試資料,男女各一筆

insert into apps.bxj_emp_tb values (1, 'gavin.bao', 'male', 100000); insert into apps.bxj_emp_tb values (2, 'gavin.bao', 'female', 200000); 

 

4.  以條件sex = male進行查詢時,系統只遍歷tablespace 1 male

 

5.  以條件sex = female進行查詢時,系統只遍歷tablespace 1 female 

 

6.  無分區條件查詢,系統需所有遍歷tablespace 1 and 2 / male and female

 

 3、 案例 - 本地分區索引


1. 建立本地分區索引

CREATE INDEX bxj_emp_tb_localindex ON apps.bxj_emp_tb(sex) LOCAL ( PARTITION idx_1 TABLESPACE bxj_emp_ts1, PARTITION idx_2 TABLESPACE bxj_emp_ts2 );

2. 解析計劃中索引遍歷方式

 

4、案例 - 全局分區索引


1.  建立全局分區索引

CREATE INDEX bxj_emp_tb_globalindexON bxj_emp_tb (salary) GLOBAL PARTITION BY RANGE ( salary ) ( PARTITION idx_1 VALUES LESS THAN (10000) TABLESPACE bxj_emp_ts1,  PARTITION idx_2 VALUES LESS THAN (MAXVALUE) TABLESPACE bxj_emp_ts2 );

2. 條件爲salary <= 100, 索引只遍歷tablespace1 

3. 條件爲salary >=100000, 索引只遍歷tablespace2

 4. 無分區條件時,索引遍歷所有

 

5、案例 - Oracle Erp交易表mtl_material_transactions的結構


select * from dba_tab_subpartitions

where table_name = 'MTL_MATERIAL_TRANSACTIONS'

 

Thanks and Regards

參考:http://www.linuxidc.com/Linux/2011-08/40763.htm

參考:http://mingyue19850801.blog.163.com/blog/static/19520820201071712231671/

相關文章
相關標籤/搜索