Oracle表空間詳解
1. 基本概念
Oracle表分區(qū)是將一個(gè)大型表分割成更小、更易于管理的部分的技術(shù)。分區(qū)后的表被稱為分區(qū)表,其中每個(gè)分區(qū)都可以獨(dú)立地進(jìn)行維護(hù)、管理和查詢。表分區(qū)可基于表中的一列或多列,稱為分區(qū)鍵,分區(qū)鍵的值確定了每行數(shù)據(jù)屬于哪個(gè)分區(qū)。
使用分區(qū)具有以下優(yōu)點(diǎn):
- (1)改善查詢性能:由于表分區(qū)將數(shù)據(jù)分割成更小、更可管理的部分,對(duì)分區(qū)對(duì)象的查詢可以僅搜索特定分區(qū),提高檢索速度。如在范圍分區(qū)的情況下,可以更快地查詢特定時(shí)間段的數(shù)據(jù)。
- (2)維護(hù)方便:分而治之,每個(gè)分區(qū)都可以獨(dú)立地進(jìn)行維護(hù)和管理,更容易地維。如表的某個(gè)分區(qū)出現(xiàn)故障,需要修復(fù)數(shù)據(jù),只修復(fù)該分區(qū)即可;又如在范圍分區(qū)的情況下,可以更容易地刪除或歸檔舊數(shù)據(jù)。
- (3)可用性:實(shí)際各分區(qū)的數(shù)據(jù)是獨(dú)立存放,如果表的某個(gè)分區(qū)出現(xiàn)故障,表在其他分區(qū)的數(shù)據(jù)仍然可用;
- (4)均衡I/O:可把不同的分區(qū)映射到磁盤以平衡I/O,改善整個(gè)系統(tǒng)性能;并且可以更快地加載數(shù)據(jù),因?yàn)榭梢圆⑿屑虞d多個(gè)分區(qū)。如在哈希分區(qū)的情況下,可以并行加載多個(gè)分區(qū),從而大大提高了數(shù)據(jù)加載的速度。
Oracle數(shù)據(jù)庫提供對(duì)表或索引的分區(qū)常用方法主要有三種:
- 范圍分區(qū)
- Hash分區(qū)(散列分區(qū))
- 復(fù)合分區(qū)
先建三個(gè)表空間:
create tablespace ma_tra01 datafile 'D:\oracle\product\10.2.0\oradata\orcl\ma_tra01.dnf' size 50M; create tablespace ma_tra02 datafile 'D:\oracle\product\10.2.0\oradata\orcl\ma_tra02.dnf' size 50M; create tablespace ma_tra03 datafile 'D:\oracle\product\10.2.0\oradata\orcl\ma_tra03.dnf' size 50M;
2. 范圍分區(qū)
范圍分區(qū)就是對(duì)數(shù)據(jù)表中的某個(gè)值的范圍進(jìn)行分區(qū),根據(jù)某個(gè)值的范圍,決定將該數(shù)據(jù)存儲(chǔ)在哪個(gè)分區(qū)上。如根據(jù)序號(hào)分區(qū),根據(jù)業(yè)務(wù)記錄的創(chuàng)建日期進(jìn)行分區(qū)等。
e.g.
需求描述:有一個(gè)物料交易表,表名:material_transactions。該表將來可能有千萬級(jí)的數(shù)據(jù)記錄數(shù)。要求在建該表的時(shí)候使用分區(qū)表。 這時(shí)候我們可以使用序號(hào)分區(qū)三個(gè)區(qū),每個(gè)區(qū)中預(yù)計(jì)存儲(chǔ)三千萬的數(shù)據(jù),也可以使用日期分區(qū),如每五年的數(shù)據(jù)存儲(chǔ)在一個(gè)分區(qū)上。
- 根據(jù)交易記錄的序號(hào)分區(qū)建表
create table material_transactions ( transaction_id number primary key, item_id number(8) not null, item_description varchar2(300), transaction_date date not null ) partition by range (transaction_id) ( partition part_01 values less than(30000000) tablespace ma_tra01, partition part_02 values less than(60000000) tablespace ma_tra02, partition part_03 values less than(maxvalue) tablespace ma_tra03);
- 根據(jù)交易日期分區(qū)建表
create table material_transactions ( transaction_id number primary key, item_id number(8) not null, item_description varchar2(300), transaction_date date not null ) partition by range (transaction_date) ( partition part_01 values less than(to_date('2006-01-01','yyyy-mm-dd')) tablespace ma_tra01, partition part_02 values less than(to_date('2010-01-01','yyyy-mm-dd')) tablespace ma_tra02, partition part_03 values less than(maxvalue) tablespace ma_tra03);
這樣分別建了以交易序號(hào)和交易日期來分區(qū)的分區(qū)表。
- 插入數(shù)據(jù):每次插入數(shù)據(jù)的時(shí)候,系統(tǒng)將根據(jù)指定的字段的值來自動(dòng)將記錄存儲(chǔ)到制定的分區(qū)(表空間)中。
insert into material_transactions values(1,12,'BOOKS1',sysdate); insert into material_transactions Values(2,12, 'BOOKS2',sysdate+30); insert into material_transactions values(3,12, 'BOOKS3',to_date('2006-05-30','yyyy-mm-dd')); insert into material_transactions values(4,12, 'BOOKS4',to_date('2007-06-23','yyyy-mm-dd')); insert into material_transactions values(5,12, 'BOOKS5',to_date('2011-02-26','yyyy-mm-dd')); insert into material_transactions values(6,12, 'BOOKS6',to_date('2011-04-30','yyyy-mm-dd')); Commit;
- 查詢分區(qū)表
select * from material_transactions partition(part_03) t
可以對(duì)分區(qū)表進(jìn)行跟新或刪除,默認(rèn)情況下,oracle的分區(qū)表對(duì)于分區(qū)字段是不允許進(jìn)行update
操作的,如果有對(duì)分區(qū)字段行進(jìn)update
,就會(huì)報(bào)ORA-14402錯(cuò)誤: 更新分區(qū)關(guān)鍵字列將導(dǎo)致分區(qū)的更改。但是可以通過打開表的row movement
屬性來允許對(duì)分區(qū)字段的update
操作,但是這樣會(huì)導(dǎo)致無效對(duì)象的產(chǎn)生,所以不推薦使用。可通過刪除舊數(shù)據(jù),插入新數(shù)據(jù)來解決。
還可以根據(jù)需求,使用兩個(gè)字段的范圍分布來分區(qū),如partition by range ( transaction_id ,transaction_date)
, 分區(qū)條件中的值也做相應(yīng)的改變。
- 增加一個(gè)分區(qū)
Alter Table material_transactions Add Partition part_04 Values Less Than (to_date('20150101','yyyymmdd')) Tablespace ma_tra04
增加分區(qū)的條件必須大于現(xiàn)有分區(qū)的最大條件值,否則會(huì)提示ORA-14074
:分區(qū)界限必須調(diào)整為高于最后一個(gè)分區(qū)界限
- 合并兩個(gè)個(gè)分區(qū)
Alter Table material_transactions Merge Partitions part_01,part_02 Into Partition part_02;
- 刪除分區(qū)(數(shù)據(jù)也會(huì)被刪除)
3. Hash分區(qū)(散列分區(qū))
散列分區(qū)為通過指定分區(qū)編號(hào)來均勻分布數(shù)據(jù)的一種分區(qū)類型,因?yàn)橥ㄟ^在I/O設(shè)備上進(jìn)行散列分區(qū),使得這些分區(qū)大小一致。如將物料交易表的數(shù)據(jù)根據(jù)交易ID散列地存放在指定的三個(gè)表空間中:
create table material_transactions_hash ( transaction_id number primary key, item_id number(8) not null, item_description varchar2(300), transaction_date Date) partition by hash(transaction_id) ( partition part_01 tablespace ma_tra01, partition part_02 tablespace ma_tra02, partition part_03 tablespace ma_tra03);
建表成功,此時(shí)插入數(shù)據(jù),系統(tǒng)將按transaction_id將記錄散列地插入三個(gè)分區(qū)中,這里也就是三個(gè)不同的表空間中。
4. 復(fù)合分區(qū)
有時(shí)需要根據(jù)范圍分區(qū)后,每個(gè)分區(qū)內(nèi)的數(shù)據(jù)再散列地分布在幾個(gè)表空間中,這樣我們就要使用復(fù)合分區(qū)。復(fù)合分區(qū)是先使用范圍分區(qū),然后在每個(gè)分區(qū)內(nèi) 再使用散列分區(qū)的一種分區(qū)方法,如將物料交易的記錄按時(shí)間分區(qū),然后每個(gè)分區(qū)中的數(shù)據(jù)分三個(gè)子分區(qū),將數(shù)據(jù)散列地存儲(chǔ)在三個(gè)指定的表空間中:
create table material_transactions_test ( transaction_id number primary key, item_id number(8) not null, item_description varchar2(300), transaction_date date ) partition by range(transaction_date) subpartition by hash(transaction_id) subpartitions 3 store in (ma_tra01,ma_tra02,ma_tra03) ( partition part_01 values less than(to_date('2006-01-01','yyyy-mm-dd')), partition part_02 values less than(to_date('2010-01-01','yyyy-mm-dd')), partition part_03 values less than(maxvalue) );
該例中,先是根據(jù)交易日期進(jìn)行范圍分區(qū),然后根據(jù)交易的ID將記錄散列地存儲(chǔ)在三個(gè)表空間中。
分區(qū)表可以建立局部索引與全局索引,當(dāng)分區(qū)表中出現(xiàn)許多事務(wù)并且要保證所有分區(qū)中的數(shù)據(jù)記錄的唯一性時(shí)需要采用全局索引。
Create Index idx_matra_itemid On material_transactions(item_id) Local; Create Index idx_matra_itemid On material_transactions(item_id);
到此這篇關(guān)于Oracle表空間詳解的文章就介紹到這了,更多相關(guān)Oracle表空間內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Oracle中update和select 關(guān)聯(lián)操作
本文主要向大家介紹了Oracle數(shù)據(jù)庫之oracle update set select from 關(guān)聯(lián)更新,通過具體的內(nèi)容向大家展現(xiàn),本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2022-01-01oracle導(dǎo)出數(shù)據(jù)到文本、從文本導(dǎo)入數(shù)據(jù)的詳細(xì)步驟
經(jīng)常有需求向表中導(dǎo)入大量的數(shù)據(jù),使用insert不靠譜,太慢了,oracle提供了sqlldr的工具,這里就為大家簡(jiǎn)單介紹一下2023-05-05Oracle 12.2監(jiān)聽無法啟動(dòng)解決方法
這篇文章主要介紹了Oracle 12.2監(jiān)聽無法啟動(dòng)解決方法,需要的朋友可以參考下2017-11-11oracle 使用sql獲取數(shù)據(jù)庫表、表的字段的多種方法
使用sql獲取數(shù)據(jù)庫表,表的字段的方法有很多,本文整理了幾個(gè)常用且實(shí)用的方法,需要的朋友可以參考下2013-11-11Oracle數(shù)據(jù)庫遷移所有文件到新掛載磁盤路徑
根據(jù)實(shí)際須要,有時(shí)安裝了oracle以后須要擴(kuò)展磁盤空間時(shí),每每是新增一個(gè)單獨(dú)的文件路徑并掛載存儲(chǔ),這時(shí)便須要總體遷移數(shù)據(jù)庫文件數(shù)據(jù)庫,本文就來介紹一下Oracle數(shù)據(jù)庫遷移所有文件到新掛載磁盤路徑2024-01-01