Ⅰ oracle分區表的分區有幾種類型
oracle分區表的分區有四種類型:范圍分區、散列分區、列表分區和復合分區。
特點如下:
1、范圍分區
就是根據資料庫表中某一欄位的值的范圍來劃分分區。
數據中有空值,Oracle機制會自動將其規劃到maxvalue的分區中。
2、散列分區
根據欄位的hash值進行均勻分布,盡可能地實現各分區所散列的數據相等。
散列分區即為哈希分區,Oracle採用哈希碼技術分區,具體分區如何由Oracle說的算,也可能我下一次搜索就不是這個數據了。
3、列表分區
列表分區明確指定了根據某欄位的某個具體值進行分區,而不是像范圍分區那樣根據欄位的值范圍來劃分的。
4、復合分區
根據范圍分區後,每個分區內的數據再散列地分布在幾個表空間中,這樣我們就要使用復合分區。復合分區是先使用范圍分區,然後在每個分區同再使用散列分區的一種分區方法。
比如將part_date的記錄按時間分區,然後每個分區中的數據分三個子分區,將數據散列地存儲在三個指定的表空間中。
(1)資料庫如何表分區擴展閱讀:
分區的恢復方法:
如果資料庫運行在archive 模式下,那麼一旦資料庫損壞則可以通過冷備份(熱備份)和歸檔備份將資料庫恢復到斷點狀態。
資料庫控制文件恢復(假設所有控制文件均被破壞):
資料庫基於文件系統: 利用操作系統的tar、cp等命令即可。
資料庫基於裸設備:dd if=$ORACLE_BASE/con.bak of=/dev/rdrd/drd1 seek=12
Ⅱ Oracle資料庫分區表操作方法
在大型的企業應用或企業級的資料庫應用中 要處理的數據量通常可以達到幾十到幾百GB 有的甚至可以到TB級 雖然存儲介質和數據處理技術的發展也很快 但是仍然不能滿足用戶的需求 為了使用戶的大量的數據在讀寫操作和查詢中速度更快 Oracle提供了對表和索引進行分區的技術 以改善大型應用系統的性能
使用分區的優點
·增強可用性 如果表的某個分區出現故障 表在其他分區的數據仍然可用
·維護方便 如果表的某個分區出現故障 需要修復數據 只修復該分區即可
·均衡I/O 可以把不同的分區映射到磁碟以平衡I/O 改善整個系統性能
·改善查詢性能 對分區對象的查詢可以僅搜索自己關心的分區 提高檢索速度
Oracle資料庫提供對表或索引的分區方法有三種
·范圍分區
·Hash分區(散列分區)
·復合分區
下面將以實例的方式分別對這三種分區方法來說明分區表的使用 為了測試方便 我們先建三個表空間
以下為引用的內容
create tablespace dinya_space
datafile /test/demo/oracle/demodata/dinya dnf size M
create tablespace dinya_space
datafile /test/demo/oracle/demodata/dinya dnf size M
create tablespace dinya_space
datafile /test/demo/oracle/demodata/dinya dnf 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( yyyy mm dd ))
tablespace dinya_space
partition part_ values less than(to_date( yyyy mm dd ))
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_space dinya_space dinya_space )
(
partition part_ values less than(to_date( yyyy mm dd ))
partition part_ values less than(to_date( yyyy mm dd ))
partition part_ values less than(maxvalue)
);
Table created
該例中 先是根據交易日期進行范圍分區 然後根據交易的ID將記錄散列地存儲在三個表空間中
分區表操作
以上了解了三種分區表的建表方法 下面將使用實際的數據並針對按日期的范圍分區來測試分區表的數據記錄的操作
插入記錄
以下為引用的內容
SQL> insert into dinya_test values( BOOKS sysdate);
row created
SQL> insert into dinya_test values( BOOKS sysdate+ );
row created
SQL> insert into dinya_test values( BOOKS to_date( yyyy mm dd ));
row created
SQL> insert into dinya_test values( BOOKS to_date( yyyy mm dd ));
row created
SQL> insert into dinya_test values( BOOKS to_date( yyyy mm dd ));
row created
SQL> insert into dinya_test values( BOOKS to_date( yyyy mm dd ));
row created
SQL> mit;
Commit plete
SQL>
按上面的建表結果 年前的數據將存儲在第一個分區part_ 上 而 年到 年的交易數據將存儲在第二個分區part_ 上 年以後的記錄存儲在第三個分區part_ 上
查詢分區表記錄 以下為引用的內容
SQL> select * from dinya_test partition(part_ );
TRANSACTION_ID ITEM_ID ITEM_DESCRIPTION TRANSACTION_DATE
BOOKS : :
BOOKS : :
SQL>
SQL> select * from dinya_test partition(part_ );
TRANSACTION_ID ITEM_ID ITEM_DESCRIPTION TRANSACTION_DATE
BOOKS
BOOKS
SQL>
SQL> select * from dinya_test partition(part_ );
TRANSACTION_ID ITEM_ID ITEM_DESCRIPTION TRANSACTION_DATE
BOOKS
BOOKS
SQL>
從查詢的結果可以看出 插入的數據已經根據交易時間范圍存儲在不同的分區中 這里是指定了分區的查詢 當然也可以不指定分區 直接執行select * from dinya_test查詢全部記錄
在也檢索的數據量很大的時候 指定分區會大大提高檢索速度
更新分區表的記錄
以下為引用的內容
SQL> update dinya_test partition(part_ ) t set em_description= DESK where
t transaction_id= ;
row updated
SQL> mit;
Commit plete
SQL>
這里將第一個分區中的交易ID= 的記錄中的item_description欄位更新為 DESK 可以看到已經成功更新了一條記錄 但是當更新的時候指定了分區 而根據查詢的記錄不在該分區中時 將不會更新數據 請看下面的例子 以下為引用的內容
SQL> update dinya_test partition(part_ ) t set em_description= DESK where
t transaction_id= ;
rows updated
SQL> mit;
Commit plete
SQL>
指定了在第一個分區中更新記錄 但是條件中限制交易ID為 而查詢全表 交易ID為 的記錄在第三個分區中 這樣該條語句將不會更新記錄
刪除分區表記錄
以下為引用的內容
SQL> delete from dinya_test partition(part_ ) t where t transaction_id= ;
row deleted
SQL> mit;
Commit plete
SQL>
上面例子刪除了第二個分區part_ 中的交易記錄ID為 的一條記錄 和更新數據相同 如果指定了分區 而條件中的數據又不在該分區中時 將不會刪除任何數據
分區表索引的使用
分區表和一般表一樣可以建立索引 分區表可以創建局部索引和全局索引 當分區中出現許多事務並且要保證所有分區中的數據記錄的唯一性時採用全局索引
局部索引分區的建立
以下為引用的內容
SQL> create index dinya_idx_t on dinya_test(item_id)
local
(
partition idx_ tablespace dinya_space
partition idx_ tablespace dinya_space
partition idx_ tablespace dinya_space
);
Index created
SQL>
看查詢的執行計劃 從下面的執行計劃可以看出 系統已經使用了索引
以下為引用的內容
SQL> select * from dinya_test partition(part_ ) t where em_id= ;
Execution Plan
SELECT STATEMENT Optimizer=CHOOSE (Cost= Card= Bytes= )
TABLE ACCESS (BY LOCAL INDEX ROWID) OF DINYA_TEST (Cost=
Card= Bytes= )
INDEX (RANGE SCAN) OF DINYA_IDX_T (NON UNIQUE) (Cost=
Card= )
Statistics
recursive calls
db block gets
consistent gets
physical reads
redo size
bytes sent via SQL*Net to client
bytes received via SQL*Net from client
SQL*Net roundtrips to/from client
sorts (memory)
sorts (disk)
rows processed
SQL>
全局索引分區的建立
全局索引建立時global 子句允許指定索引的范圍值 這個范圍值為索引欄位的范圍值
以下為引用的內容
SQL> create index dinya_idx_t on dinya_test(item_id)
global partition by range(item_id)
(
partition idx_ values less than ( ) tablespace dinya_space
partition idx_ values less than ( ) tablespace dinya_space
partition idx_ values less than (maxvalue) tablespace dinya_space
);
Index created
SQL>
本例中對表的item_id欄位建立索引分區 當然也可以不指定索引分區名直接對整個表建立索引 如
以下為引用的內容
SQL> create index dinya_idx_t on dinya_test(item_id);
Index created
SQL>
同樣的 對全局索引根據執行計劃可以看出索引已經可以使用
以下為引用的內容
SQL> select * from dinya_test t where em_id= ;
Execution Plan
SELECT STATEMENT Optimizer=CHOOSE (Cost= Card= Bytes= )
TABLE ACCESS (BY GLOBAL INDEX ROWID) OF DINYA_TEST (Cost
= Card= Bytes= )
INDEX (RANGE SCAN) OF DINYA_IDX_T (NON UNIQUE) (Cost=
Card= )
Statistics
recursive calls
db block gets
consistent gets
physical reads
redo size
bytes sent via SQL*Net to client
bytes received via SQL*Net from client
SQL*Net roundtrips to/from client
sorts (memory)
sorts (disk)
rows processed
SQL>
分區表的維護
了解了分區表的建立 索引的建立 表和索引的使用後 在應用的還要經常對分區進行維護和管理 日常維護和管理的內容包括 增加一個分區 合並一個分區及刪除分區等等 下面以范圍分區為例說明增加 合並 刪除分區的一般操作
增加一個分區:
以下為引用的內容
SQL> alter table dinya_test
add partition part_ values less than(to_date( yyyy mm dd ))
tablespace dinya_spa
ce ;
Table altered
SQL>
增加一個分區的時候 增加的分區的條件必須大於現有分區的最大值 否則系統將提示ORA partition bound must collate higher than that of the last partition 錯誤
合並一個分區
以下為引用的內容
SQL> alter table dinya_test merge partitions part_ part_ into partition part_ ;
Table altered
SQL>
在本例中將原有的表的part_ 分區和part_ 分區進行了合並 合並後的分區為part_ 如果在合並的時候把合並後的分區定為part_ 的時候 系統將提示ORA cannot reuse lower bound partition as resulting partition 錯誤
刪除分區
以下為引用的內容
SQL> alter table dinya_test drop partition part_ ;
Table altered
SQL>
刪除分區表的一個分區後 查詢該表的數據時顯示 該分區中的數據已全部丟失 所以執行刪除分區動作時要慎重 確保先備份數據後再執行 或將分區合並
總結
lishixin/Article/program/Oracle/201311/17329
Ⅲ 如何對已經存在的數據表進行分區
過程中為SQL Server數據表劃分為三個步驟:
1)建立分區函數
2)建立分區方案
3)對表的分區
第一步:建立分區函數
分區函數定義[U]如何[/ U],也就是你想怎麼SQL Server數據分區。這里不是一個特定的表作為一個例子,但總的技術部門總結的數據。
分區指定為每個分區用分區邊界來實現。例如,假設我們有一個客戶表,其中包含所有的企業客戶信息,客戶信息與客戶的唯一標識號,客戶編號從1到100萬。我們可以使用下面的分區功能(這里稱為customer_Partfunc)把這個表分為四個分區:
CREATE PARTITION FUNCTION customer_partfunc(INT)
AS RANGE RIGHT
輸入值( 250000,500000,750000)
這些邊界劃分指定了四個分區。第一個分區包含所有值?少於25萬的記錄。第二個分區包含所有值?之間250,000和499,999的記錄。第三個分區包含所有值?500,000至749,999記錄。大於或等於750,000的所有其他記錄都包含在第四個分區中。
請注意,此示例使用「RANGE RIGHT」條款。這表明,該邊界值是分區的右側。同樣,如果您使用「RANGE LEFT」條款,那麼第一個分區將包含所有的值小於或等於25萬條記錄;?第二個分區將包含所有的值250001和500000之間的記錄,等等??
第二步:創建
分區方案
一旦如何分區功能分區後的數據完整的定義,下一步是創建一個分區方案,定義[ U],其中[/ U],這就是你要分區的數據。這是一個非常簡單的過程,例如,如果我有四個文件組,從「FG1」到「FG4」的名字,那麼你可以使用下面的分區方案:
創建分區計劃customer_partscheme
作為間隔customer_partfunc
要(FG1,FG2,FG3,FG4)
請注意,我們現在把一個分區函數連接到分區規劃,但我們還沒有連接在分區方案的任何具體的資料庫表。這是重復使用的功能函數時。我們可以利用這個功能來分區方案(或只是一個分區函數)對資料庫表的任何數據。
第三步:表已分區
建立良好的分區方案後,就可以開始對表進行分區。這是最簡單的一步,只需加上「ON」子句中的表創建語句指定表的分區方案,並申請表列的分區方案。你不需要指定分區函數,分區方案已經因為分區函數定義。
例如,假設你想使用上述的分區方案來創建一個客戶表,您需要使用以下Transact-SQL語句:
CREATE TABLE客戶(姓數據類型為nvarchar(40),姓氏為nvarchar(40),CUSTOMERNUMBER INT)
開customer_partscheme(CUSTOMERNUMBER)
Ⅳ oracle資料庫按照一定條件把表拆分為多個表
其實不需要拆分表,分區就可以,還是原來的表名,只是將原來的表分成了若乾的分區,這樣能起到分表的效果,還不用分成很多的表。
比如你原來的表的名字是A,那麼將該表改為A1,然後從新建立一個分區表A,分區的依據是班級,也就是list分區,也就是一般意義上的列表分區表。
然後再將A1的數據插入新A表就可以了。
至於分區表的建立方式,往上很多,可以自行查找。
這樣操作查詢的語句不需要變,只是在不跨分區查詢的情況下,相當於分成了若干張表去查詢。比如查詢1班的成績,那麼就是在1班的分區內,不會有2班的問題,就相當於你用一個指頭就能解決問題,不會動用這個手一樣。
如果分表的話,那麼假設有12個班,那麼就要建立12張表,這樣的話,語句就要寫12次,冗餘太大了。