Oracle數據庫分區是作為Oracle數據庫性能優化的一種重要的手段和方法做手頭的項目以前只聆聽過分區的大名感覺特神秘看見某某高手在討論會上誇誇其談時真是罵自己學藝不精最近作GPS方面的項目處理的數據量達到了幾十GB為了滿足系統的實時性要求必須提高數據的查詢效率這樣就必須通過分區以解燃眉之急!
先說說分區的好處吧!
) 增強可用性如果表的某個分區出現故障表在其他分區的數據仍然可用
) 維護方便如果表的某個分區出現故障需要修復數據只修復該分區即可
) 均衡I/O可以把不同的分區映射到磁盤以平衡I/O改善整個系統性能
) 改善查詢性能對分區對象的查詢可以僅搜索自己關心的分區提高檢索速度
Oracle數據庫提供對表或索引的分區方法有三種
ü 范圍分區
ü Hash分區(散列分區)
ü 復合分區
一范圍分區詳細說明
范圍分區就是對數據表中的某個值的范圍進行分區根據某個值的范圍決定將該數據存儲在哪個分區上如根據序號分區根據時間等來進行分區根據序號比如小於的放在part ~的放在part
create table AAA
(
id number primary key
indate date not null
)
partition by range(indate)
(
partition part_ values less than(to_date(yyyymmdd)) tablespace space
partition part_ values less than(to_date(yyyymmdd)) tablespace space
partition part_ values less than(maxvalue) tablespace space
);
space\ space\ space為建立的三個表空間相當於把建立的一個大的表分在了個不同的表空間的分區上了
二Hash分區(散列分區)詳細說明
散列分區為通過指定分區編號來均勻分布數據的一種分區類型因為通過在I/O設備上進行散列分區使得這些分區大小一致也就是只命名分區名稱這樣均勻進行數據分布
三復合分區詳細說明
有時候我們需要根據范圍分區後每個分區內的數據再散列地分布在幾個表空間中這樣我們就要使用復合分區復合分區是先使用范圍分區然後在每個分區內再使用散列分區的一種分區方法
partition by range(indate)subpartition by hash(id)
subpartitions store in (space space space)
(
partition part_ values less than(to_date(yyyymmdd))
partition part_ values less than(to_date(yyyymmdd))
partition part_ values less than(maxvalue)
);
四分區表操作
插入記錄insert into AAA values( sysdate);
查詢分區表記錄select * from AAA partition(part_);
更新分區表的記錄update AAA partition(part_) t set indate=where id=; 但是當更新的時候指定了分區而根據查詢的記錄不在該分區中時將不會更新數據
刪除分區表記錄delete from AAA partition(part_) t where id=; 如果指定了分區而條件中的數據又不在該分區中時將不會刪除任何數據
增加一個分區alter table AAA add partition part_ values less than(to_date(yyyymmdd)) tablespace dinya_spa ce; 增加一個分區的時候增加的分區的條件必須大於現有分區的最大值否則系統將提示ORA partition bound must collate higher than that of the last partition 錯誤
合並一個分區alter table AAA merge partitions part_part_ into partition part_; 如果在合並的時候把合並後的分區定為part_的時候系統將提示ORA cannot reuse lowerbound partition as resulting partition 錯誤
刪除分區alter table AAA drop partition part_; 刪除分區表的一個分區後查詢該表的數據時顯示該分區中的數據已全部丟失所以執行刪除分區動作時要慎重確保先備份數據後再執行或將分區合並
五建立索引
分區表和一般表一樣可以建立索引分區表可以創建局部索引和全局索引當分區中出現許多事務並且要保證所有分區中的數據記錄的唯一性時采用全局索引
局部索引分區的建立create index idx_t on AAA(id)
local
(
partition idx_ tablespace space
partition idx_ tablespace space
partition idx_ tablespace space
);
全局索引建立時global 子句允許指定索引的范圍值這個范圍值為索引字段的范圍值create index idx_t on AAA(id)
global partition by range(id)
(
partition idx_ values less than () tablespace space
partition idx_ values less than () tablespace space
partition idx_ values less than (maxvalue) tablespace space
);
當然也可以不指定索引分區名直接對整個表建立索引: create index idx_t on AAA(id);
在大型的企業應用或企業級的數據庫應用中要處理的數據量通常可以達到幾十到幾百GB有的甚至可以到TB級雖然存儲介質和數據處理技術的發展也很快但是仍然不能滿足用戶的需求為了使用戶的大量的數據在讀寫操作和查詢中速度更快Oracle提供了對表和索引進行分區的技術以改善大型應用系統的性能
使用分區的優點
·增強可用性如果表的某個分區出現故障表在其他分區的數據仍然可用
·維護方便如果表的某個分區出現故障需要修復數據只修復該分區即可
·均衡I/O可以把不同的分區映射到磁盤以平衡I/O改善整個系統性能
·改善查詢性能對分區對象的查詢可以僅搜索自己關心的分區提高檢索速度
Oracle數據庫提供對表或索引的分區方法有三種
·范圍分區
·Hash分區(散列分區)
·復合分區
下面將以實例的方式分別對這三種分區方法來說明分區表的使用為了測試方便我們先建三個表空間
create tablespace dinya_space
datafile /test/demo/oracle/demodata/dinyadnf size M
create tablespace dinya_space
datafile /test/demo/oracle/demodata/dinyadnf size M
create tablespace dinya_space
datafile /test/demo/oracle/demodata/dinyadnf size M
分區表的創建
范圍分區
范圍分區就是對數據表中的某個值的范圍進行分區根據某個值的范圍決定將該數據存儲在哪個分區上如根據序號分區根據業務記錄的創建日期進行分區等
需求描述有一個物料交易表表名material_transactions該表將來可能有千萬級的數據記錄數要求在建該表的時候使用分區表這時候我們可以使用序號分區三個區每個區中預計存儲三千萬的數據也可以使用日期分區如每五年的數據存儲在一個分區上
根據交易記錄的序號分區建表
SQL> create table dinya_test
(
transaction_id number primary key
item_id number() not null
item_description varchar()
transaction_date date not null
)
partition by range (transaction_id)
(
partition part_ values less than() tablespace dinya_space
partition part_ values less than() tablespace dinya_space
partition part_ values less than(maxvalue) tablespace dinya_space
);
Table created
建表成功根據交易的序號交易ID在三千萬以下的記錄將存儲在第一個表空間dinya_space中分區名為:par_在三千萬到六千萬之間的記錄存儲在第二個表空間
dinya_space中分區名為par_而交易ID在六千萬以上的記錄存儲在第三個表空間dinya_space中分區名為par_
根據交易日期分區建表
SQL> create table dinya_test
(
transaction_id number primary key
item_id number() not null
item_description varchar()
transaction_date date not null
)
partition by range (transaction_date)
(
partition part_ values less than(to_date(yyyymmdd))
tablespace dinya_space
partition part_ values less than(to_date(yyyymmdd))
tablespace dinya_space
partition part_ values less than(maxvalue) tablespace dinya_space
);
Table created
這樣我們就分別建了以交易序號和交易日期來分區的分區表每次插入數據的時候系統將根據指定的字段的值來自動將記錄存儲到制定的分區(表空間)中
當然我們還可以根據需求使用兩個字段的范圍分布來分區如partition by range ( transaction_id transaction_date) 分區條件中的值也做相應的改變請讀者自行測試
Hash分區(散列分區)
散列分區為通過指定分區編號來均勻分布數據的一種分區類型因為通過在I/O設備上進行散列分區使得這些分區大小一致如將物料交易表的數據根據交易ID散列地存放在指定的三個表空間中
SQL> create table dinya_test
(
transaction_id number primary key
item_id number() not null
item_description varchar()
transaction_date date
)
partition by hash(transaction_id)
(
partition part_ tablespace dinya_space
partition part_ tablespace dinya_space
partition part_ tablespace dinya_space
);
Table created
建表成功此時插入數據系統將按transaction_id將記錄散列地插入三個分區中這裡也就是三個不同的表空間中
復合分區
有時候我們需要根據范圍分區後每個分區內的數據再散列地分布在幾個表空間中這樣我們就要使用復合分區復合分區是先使用范圍分區然後在每個分區內再使用散列分區的一種分區方法如將物料交易的記錄按時間分區然後每個分區中的數據分三個子分區將數據散列地存儲在三個指定的表空間中
SQL> create table dinya_test
(
transaction_id number primary key
item_id number() not null
item_description varchar()
transaction_date date
)
partition by range(transaction_date)subpartition by hash(transaction_id)
subpartitions store in (dinya_spacedinya_spacedinya_space)
(
partition part_ values less than(to_date(yyyymmdd))
partition part_ values less than(to_date(yyyymmdd))
partition part_ values less than(maxvalue)
);
Table created
該例中先是根據交易日期進行范圍分區然後根據交易的ID將記錄散列地存儲在三個表空間中
From:http://tw.wingwit.com/Article/program/Oracle/201311/18166.html