日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

oracle partition - oracle - hgcwen_wen

 YES_MAN 2009-04-14
oracle partition

Oracle Partition介紹

 

本文章的目的

     了解Oracle Partition的使用和技巧

 

本文對(duì)象

     具有Oracle的基礎(chǔ)知識(shí),具有一定的Oracle管理知識(shí)的DBA管理人員

 

系統(tǒng)環(huán)境說明

操作系統(tǒng) , Win2000

Oracle 版本: 8.1.7

 

分區(qū)的使用

為什么要使用分區(qū)特性.

使用分區(qū)的主要三個(gè)原因﹕

。提高系統(tǒng)的可用性.

。減輕管理負(fù)擔(dān).

。提高DML和查詢操作.

 

Table Versus Index Partitioning

 

<!--[if !vml]--><!--[endif]-->

 

 

分區(qū)的模式

Oracle8.1.7版本下存在以下三種分區(qū)的方法:

﹑范圍分區(qū)

    partition by range (column_name)

﹑散列分區(qū)

    partition by hash (column_name)

﹑混合分區(qū)

    partition by range (column_name)

    subpartition  by hash(hash_key_column)

9i后續(xù)的版本中新增一種列表分區(qū). 以關(guān)鍵字List標(biāo)示.

 

分區(qū)的索引

像表一樣﹐索引也可以進(jìn)行分區(qū)﹐但只有兩種可能的索引分區(qū)方法??梢冤s

﹑對(duì)已分區(qū)的表中的索引進(jìn)行均勻分區(qū)﹐亦稱局部索引。

    [即索引的分區(qū)數(shù)目與表分區(qū)的數(shù)目是等同的﹐創(chuàng)建這 

     類索引以關(guān)索字 Local 來(lái)標(biāo)示]

 

﹑按范圍對(duì)索引進(jìn)行分區(qū)﹐亦稱全局索引。

    [即自已重新進(jìn)行布局范圍的大小﹐注意這里僅能利用

     range型﹐不能用 hash list 類型的方法]

 

分區(qū)的優(yōu)勢(shì)之-提高可用性

可用性來(lái)源于這樣一個(gè)事實(shí)﹕其表雖然在邏輯上是統(tǒng)一的﹐但各分區(qū)在物理上是獨(dú)立的實(shí)體﹐可分別存放在不同的磁盤空間上。Oracle優(yōu)化器知道實(shí)現(xiàn)分區(qū)的方案﹐并且將會(huì)相應(yīng)地從查詢方案中剔除不可用的分區(qū)。例証﹕

Create table emp2(id ,ename) partition by hash(id) (partition p_1 tablespace indx,partition p_2 tablespace indx1) as select empno,ename from emp;

SQL> select *  from emp2 partition (p_1);

   ID ENAME

----- ----------

 7789 SCOTT

 7839 KING

 7876 ADAMS

 7934 MILLER

select *  from emp2 partition (p_2);

ID ENAME

----- ----------

 7788 SCOTT

 7844 TURNER

 7900 JAMES

 7902 FORD

Alter tablespace indx offline﹔我們來(lái)使表空間 Indx脫機(jī).

SQL> select *  from emp2;  這樣查詢會(huì)出錯(cuò)。

ORA-00376: file 6 cannot be read at this time

ORA-01110: data file 6: ‘/orabase/oradata/app/indx01.dbf‘  

SQL> select *  from emp2 where id =7902; 查沒脫機(jī)的可以

 ID ENAME

----- ----------

 7902 FORD

總結(jié)﹕將表分區(qū)后放在不同的所屬表空間是很有必要的﹐當(dāng)磁盤發(fā)生物理?yè)p壞時(shí)能將故障時(shí)間降到最低。例如﹐有一個(gè)100G的大表﹐被分割成 50個(gè)分區(qū)﹐當(dāng)其中一個(gè) 分區(qū)受損﹐那么現(xiàn)在的恢復(fù)時(shí)間僅只是恢復(fù)這個(gè)2G分區(qū)的所花費(fèi)的時(shí)間﹐也降低了恢復(fù)的難度﹐而其它的分區(qū)的數(shù)據(jù)依然可能使用當(dāng)然這要使用有條件的分區(qū)排除才行。

 

分區(qū)的優(yōu)勢(shì)之-減輕管理負(fù)擔(dān)

管理負(fù)擔(dān)的減輕來(lái)源于這樣的事實(shí)﹕小表的管理始終優(yōu)于對(duì)大型表的管理。相對(duì)于大型對(duì)象而言﹐對(duì)較小的對(duì)象執(zhí)行操作自然更容易﹑更快且需要的資料會(huì)更少。

所謂有管理如我們?nèi)粘K龅末s

alter table move…..

Index rebuild ….

表中舊資料的歸檔….

利用分區(qū)的 split 屬性與單獨(dú)表中的數(shù)據(jù)交換….

 

分區(qū)的優(yōu)勢(shì)之-DML與查詢?cè)鰪?qiáng)

增強(qiáng)的DML性能指的是執(zhí)行并行DML(PDML)的可能。在PDML中﹐Oracle使用非單個(gè)連續(xù)進(jìn)程而是多個(gè)進(jìn)程進(jìn)行處理INSERTUPDATEDELETE。在一個(gè)有足夠I/O帶寬的多CPU機(jī)器中﹐對(duì)于大量的DML操作﹐其潛在的加速性能是巨大的。

PDML雖然有其巨大的性能特別是在 DDS環(huán)境下的系統(tǒng)﹐但是我們不能將PDML看作是加速OLTP應(yīng)用程序的一個(gè)特性。因?yàn)槟承┨囟ǖ牟僮黜氃谄涮囟ǖ沫h(huán)境下才可以的﹐對(duì)于某些操作而言并行操作比串行執(zhí)行可能會(huì)慢許多倍。我們知道在并行時(shí)會(huì)有許多開銷﹐系統(tǒng)要作更多的協(xié)調(diào)工作。理解OLTP系統(tǒng)﹐其目的是最大程度上地使用機(jī)器。

 

它們用于使單個(gè)用戶能完全使用機(jī)器上所有的磁盤﹑CPU和內(nèi)存。用戶只是在做短時(shí)的﹑快速的事務(wù)處理。這樣利用并行來(lái)增大伸縮性在這兒就完全沒有用途了。因此將其這個(gè)特性利用到DDS將會(huì)事半功倍。

在查詢性能方面﹐分區(qū)與兩種類型的特殊操作一起發(fā)揮作用﹕

﹑分區(qū)排除﹕在處理查詢?nèi)蝿?wù)時(shí)﹐利用謂詞來(lái)過濾一些不考慮的分區(qū)﹐如脫機(jī)的表空間存在仍能查詢就是利用這

    特性。

﹑并行操作﹕并行索引掃描﹐由此索引分區(qū)能被并行掃描

 

 

分區(qū)的優(yōu)勢(shì)之總結(jié)

如果要以某種順序來(lái)敘述分區(qū)的好處﹐將會(huì)是﹕

1]提高數(shù)據(jù)的可用性。這對(duì)所有的系統(tǒng)類型都有利.

2]通過從數(shù)據(jù)庫(kù)中去除大型對(duì)象來(lái)減輕對(duì)大對(duì)象的管理對(duì)所有的系統(tǒng)類型都有得.

3]提高某些DML語(yǔ)句和查詢?nèi)蝿?wù)的性能主要對(duì)大型數(shù)據(jù)倉(cāng)庫(kù)環(huán)境有利.

4]通過將插入操作擴(kuò)展到放多獨(dú)立的分區(qū)[熱點(diǎn)散開]﹐減少高插入所帶到的系統(tǒng)資料爭(zhēng)用現(xiàn)象。

因此﹐通過上述應(yīng)可以在何種情況下利用分區(qū)將帶來(lái)好的系統(tǒng)性能作出很好的判斷。

 

分區(qū)的模式理解

范圍分區(qū)[Range]﹕以這種模式進(jìn)行分區(qū)是一種可預(yù)見性的對(duì)數(shù)據(jù)范圍的分布。在后續(xù)的管理中簡(jiǎn)單方便。特別是在對(duì)于歷史數(shù)據(jù)的處理上很有優(yōu)勢(shì)。但在存儲(chǔ)數(shù)據(jù)方面不能均勻的分布。

 

散列分區(qū)[Hash]﹕這種模式適用于沒有可用于分區(qū)的自然范圍的數(shù)據(jù)﹐用于對(duì)范圍沒有意義的屬性。但這種分區(qū)能很好的處理I/o問題﹐數(shù)據(jù)均勻分布在存儲(chǔ)空間上。

 

濁合分區(qū){Range/Hash}﹕這種模式用于當(dāng)數(shù)據(jù)合理﹐能以范圍進(jìn)行區(qū)分﹐但分區(qū)后數(shù)據(jù)仍然太大難以進(jìn)行有效的管理這樣用散列函數(shù)進(jìn)一步劃分每一個(gè)分區(qū)這將允許在任意個(gè)大分區(qū)中I/O請(qǐng)求擴(kuò)展到多個(gè)磁盤。

Oracle9ilist分區(qū)暫不考慮。

 

分區(qū)的索引

前面有講﹐像表一樣﹐索引也可以進(jìn)行分區(qū)﹐有兩種可能的索引分區(qū)。

Local Index ﹕這種索引只征對(duì)已經(jīng)分區(qū)的表來(lái)講的﹐即在已有分區(qū)的表中的各個(gè)小區(qū)對(duì)應(yīng)建立索引分區(qū)。

    create index idx_ptt on p_tt(nm) local

 SQL> select Table_name,PARTITION_NAME ,HIGH_VALUE

     From user_tab_partitions where table_name ='P_TT';

TABLE_NAME     PARTITION_NAME       HIGH_VALUE

--------------------------------------------

P_TT          P_1                   10

P_TT          P_2                   20

以上顯示建有一個(gè)含兩個(gè)分區(qū)的表.

SQL> select INDEX_NAME,PARTITION_NAME ,HIGH_VALUE

from user_ind_partitions a where a.index_name='IDX_PTT';

INDEX_NAME        PARTITION_NAME           HIGH_VALUE

---------------- ------------------- ----------------

IDX_PTT           P_1                    10

IDX_PTT           P_2                    20

上述顯示同樣的這個(gè)索引也是含有兩個(gè)分區(qū)的分區(qū)索引。

然而就分區(qū)索引建立時(shí)是否含有分區(qū)鍵又將索引分為﹕

局部前綴索引與局部非前綴索引。

Create index idx_pre on p_tt(id,nm) local;

Create index idx_nopre on p_tt(nm) local;

如果Table p_tt id 來(lái)為分區(qū)Key ﹐那么第一個(gè)索引將稱之為含前綴索引﹐第二個(gè)為非前綴索引。下面來(lái)講它們的區(qū)別﹕

 

分區(qū)的索引

這兩種類型的索引都可利用分區(qū)排除的方法﹐兩者都支持惟一性(只要非前綴引包括分區(qū)碼雖然不是放在前導(dǎo)位置)事實(shí)上使用局部前綴索引的查詢?nèi)蝿?wù)將總是允許索引分區(qū)的使用﹐而使用局部非前綴的查詢可能不允許除非在謂詞中有將所有的分區(qū)鍵含括在其中﹐這就是為什么局部非前綴索引據(jù)說較慢的原因﹕它們不強(qiáng)調(diào)分區(qū)排除﹐雖然支持。所以 Oracle文檔強(qiáng)調(diào)這個(gè)﹕局部前綴索引比局部非前綴引具有更好的性能﹐因它們將檢查的索引數(shù)目最小化

下面來(lái)例証一下﹕…..

 

分區(qū)的索引之局部索引例証

CREATE TABLE partitioned_table

( a int,  b int)  PARTITION BY RANGE (a)

(PARTITION part_1 VALUES LESS THAN(2) ,

PARTITION part_2 VALUES LESS THAN(3))

insert into partitioned_table values ( 1, 1 );

create index local_prefixed on partitioned_table (a,b) local;

alter index local_prefixed modify partition part_2 unusable;

SQL> insert into partitioned_table values ( 2, 1 );

ORA-01502: index 'SCOTT.LOCAL_NONPREFIXED' or partition of such index is in unusable state

上面錯(cuò)誤可以看出由于分區(qū)2的索引不可用﹐所以不能新增資料到里面﹐看sql計(jì)劃:

SQL> select * from partitioned_table where a = 1 and b = 1;

執(zhí)行計(jì)畫

----------------------------------------------------------

   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=1 Bytes=26)

   1    0   INDEX (RANGE SCAN) OF ‘LOCAL_PREFIXED’ (NON-UNIQUE) (Cost=1 Card=1 Bytes=26)  使用前綴索引查詢成功﹐能夠?qū)?/span>par_2 從中排除﹐因?yàn)橹付?/span> a=1。

我們?cè)倏吹诙€(gè)例子….. 建立非前綴索引.

 

局部索引例証

create index local_nonprefixed on partitioned_table (b) local;

alter index local_nonprefixed modify partition part_2 unusable;

SQL> select * from partitioned_table where b = 1;

ERROR:ORA-01502: index 'SCOTT.LOCAL_NONPREFIXED' or partition of such

index is in unusable state

這里看到因?yàn)?/span> 第二index 是非前綴索引﹐它不能將分區(qū)2從查詢中排除﹐所以Error。

再來(lái)看看﹐當(dāng)我們將第一個(gè)索引-前綴索引 drop 后再來(lái)查詢會(huì)有什么結(jié)果.

drop index local_prefixed;

SQL> select * from partitioned_table where a = 1 and b = 1;

執(zhí)行計(jì)畫

----------------------------------------------------------

   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=1 Bytes=26)

   1    0   TABLE ACCESS (BY LOCAL INDEX ROWID) OF 'PARTITIONED_TABLE'

           (Cost=1 Card=1 Bytes=26)

   2    1     INDEX (RANGE SCAN) OF 'LOCAL_NONPREFIXED' (NON-UNIQUE) (

          Cost=1 Card=1)

 

因?yàn)檫@對(duì)于前面那個(gè)Error的查詢而言﹐這幾乎是一個(gè)相同的查詢方案﹐但這次成功了。那是因?yàn)榧词箾]有前綴的索引﹐但因?yàn)橹^詞中有包含分區(qū)鍵﹐它能夠?qū)⒛切┯貌坏降姆謪^(qū)排除之外。

從上面的例子中可能看出﹐局部的前綴索引與非前綴索引在可能情況下沒有什么很大的區(qū)別。 但是在有進(jìn)行表連接的查詢則結(jié)果就可能不同。例﹑﹑﹑

CREATE TABLE range_example

( range_key_column date,  x     int,data      varchar2(20))

PARTITION BY RANGE (range_key_column)

( PARTITION part_1 VALUES LESS THAN (to_date('01-01-1995','dd-mm-yyyy')),

  PARTITION part_2 VALUES LESS THAN (to_date('01-01-1996','dd-mm-yyyy')))

alter table range_example add constraint range_example_pk primary key (range_key_column,x) using index local

 

alter table range_example

add constraint range_example_pk

primary key (range_key_column,x) using index local

insert into range_example values ( to_date('01-01-1994','dd-mm-yyyy'), 1, 'xxx' );

insert into range_example values ( to_date('01-01-1995','dd-mm-yyyy'), 2, 'xxx' );

建立一個(gè)局部前綴索引﹐再建立另一個(gè)測(cè)試所用的表:

create table test ( pk , range_key_column , x,   constraint test_pk primary key(pk) )

as select rownum, range_key_column, x from range_example

SQL> select * from test, range_example  where test.pk = 1

  3    and test.range_key_column = range_example.range_key_column

  4    and test.x = range_example.x;

 

執(zhí)行計(jì)畫

----------------------------------------------------------

   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=47)

   1    0   NESTED LOOPS (Cost=2 Card=1 Bytes=47)

   2    1     TABLE ACCESS (BY INDEX ROWID) OF 'TEST' (Cost=1 Card=1 Bytes=35)

   3    2       INDEX (RANGE SCAN) OF 'TEST_PK' (UNIQUE) (Cost=1 Card=1)

   4    1     PARTITION RANGE (ITERATOR)

   5    4       TABLE ACCESS (BY LOCAL INDEX ROWID) OF 'RANGE_EXAMPLE'(Cost=1 Card=2 Bytes=24)

   6    5         INDEX (UNIQUE SCAN) OF 'RANGE_EXAMPLE_PK' (UNIQUE)

上面查詢方案很清楚的表述了這條sql 所走的執(zhí)行路徑﹐但當(dāng)我將前面分區(qū)表的那個(gè)前綴索引換成一個(gè)非前綴的看看有什么變化。

SQL> alter table range_example

  2  drop constraint range_example_pk

  3  /

已更改表格.

 

alter table range_example add constraint range_example_pk

primary key (x,range_key_column)  using index local;

已更改表格.

SQL> select * from test, range_example   where test.pk = 1

 2    and test.range_key_column = range_example.range_key_column

 3    and test.x = range_example.x;

執(zhí)行計(jì)畫

----------------------------------------------------------

   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=23)

   1    0   NESTED LOOPS (Cost=2 Card=1 Bytes=23)

   2    1     TABLE ACCESS (BY INDEX ROWID) OF 'TEST' (Cost=1 Card=1 Bytes=11)

3    2       INDEX (UNIQUE SCAN) OF 'TEST_PK' (UNIQUE)

   4    1     PARTITION RANGE (ITERATOR)

   5    4       TABLE ACCESS (FULL) OF 'RANGE_EXAMPLE' (Cost=1 Card=46 bytes=552)

從這里可以看出因?yàn)榉乔熬Y索引在這里它會(huì)認(rèn)為代價(jià)太高﹐所以舍棄用它而用全表掃描來(lái)替代。

 

分區(qū)的索引之全局索引

全局索引是使用與它們所在的表不同的模式來(lái)進(jìn)行分區(qū)的的﹐例這個(gè)表可能按timestamp 來(lái)分成 10個(gè)分區(qū)﹐而其表中的全局索引則可以按 region來(lái)分成5個(gè)分區(qū)。與局部索引不同﹐在oracle 中只有一類全局索引﹐即前綴全局索引。Oracle不支持索引碼不以分區(qū)碼開頭的全局索引。例﹕

CREATE TABLE partitioned

( timestamp date,  id        int,  nn        int)

PARTITION BY RANGE (timestamp)

(PARTITION part_1 VALUES LESS THAN

( to_date('01-01-2000','dd-mm-yyyy') ) ,

PARTITION part_2 VALUES LESS THAN

( to_date('01-01-2001','dd-mm-yyyy') ))

上面的表中建立了以 timestamp列來(lái)為分區(qū)鍵的分區(qū)表﹐有分區(qū)兩個(gè)。接下來(lái)我們來(lái)建立全局索引。

 

create index partitioned_index

on partitioned(id)

GLOBAL

partition  by range(id)

(partition part_1 values less than(1000),

partition part_2 values less than (MAXVALUE))

這里我們建立了在id列上面的全局索引。注意這個(gè)索引中的 maxvalue關(guān)鍵字的使用﹐這是因?yàn)樵谌炙饕斜仨氂糜谄渲些o它代表的范圍是無(wú)限上界﹐確保所有的行都能放至于這個(gè)索引之中。

前面有說過在非分區(qū)的表中也可以存在分區(qū)索引﹐條件是僅能存在全局分區(qū)索引。當(dāng)然全局索引的限制[前綴方式存在﹑只以基于 range 分區(qū)類型]也同樣受用。例﹕

SQL> create table test (id number,nm  char);

SQL> create index idx_test on test(id)

global partition by range (id)

(partition p1 values less than (10),

 partition p2 values less than (maxvalue))

 

全局索引有一個(gè)特點(diǎn)﹐當(dāng)操作其中任一個(gè)表分區(qū)都會(huì)造成全局索引無(wú)效則須要重建。

SQL> alter table empp drop partition p4 ;

Table altered

SQL> select *  from empp where job ='ANALYST';

select *  from empp where job ='ANALYST'

ORA-01502: index 'SCOTT.EMP_JOB_IDX' or partition of such index is in unusable state

SQL> alter session set skip_unusable_indexes =true;

Session altered

SQL> select *  from empp where job ='ANALYST';

EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO LOC

----- ---------- --------- ----- ----------- --------- --------- ------ -------------

可以利用8.1.5后新加入的參數(shù)skip_unusable_indexes 躍過不可用的索引﹐但是這樣就失去了索引所帶來(lái)的性能提高。因此最終的方法還是重建索引。

SQL> alter index EMP_JOB_IDX rebuild;

SQL> select *  from empp where job ='ANALYST';

EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO LOC

 

分區(qū)索引之 總結(jié)

已經(jīng)列舉了分區(qū)索引的兩種類型﹐local/global

根據(jù)自己所用的系統(tǒng)來(lái)決定那種分區(qū)索引較適合使用。專家建議﹕數(shù)據(jù)倉(cāng)庫(kù)應(yīng)是與局部索引相匹配。OLTP系統(tǒng)應(yīng)是與全局索引相區(qū)配。

 

因?yàn)樵?/span>oltp系統(tǒng)中﹐我們要達(dá)到的目的是﹕快速訪問﹑數(shù)據(jù)完整性﹑可用性。全局索引可以做這件事。Oltp系統(tǒng)的特點(diǎn)與數(shù)據(jù)倉(cāng)庫(kù)非常不同。我們或許不會(huì)做滑動(dòng)窗口﹐不會(huì)分割分區(qū)﹐不會(huì)移動(dòng)數(shù)據(jù)等 等。我們?cè)跀?shù)據(jù)倉(cāng)庫(kù)中執(zhí)行的操作在整體上不會(huì)在有效的oltp系統(tǒng)中完成。

如果我們應(yīng)用的是全局索引那么對(duì)分區(qū)任何操作都將引起全局索引失效﹐那么全局索引必須重構(gòu){當(dāng)然在局部索引中索引也要重構(gòu)只是僅僅對(duì)當(dāng)事的那個(gè)分區(qū)}等等。

 

例証系統(tǒng)中分區(qū)的使用

現(xiàn)行的一些系統(tǒng)中就有可能對(duì)分區(qū)的運(yùn)用﹐如應(yīng)付憑單檔﹑帳單檔﹑傳票檔等等﹑﹑﹑

所采用的分區(qū)是以 range 的類型﹐按年月來(lái)分﹐每一個(gè)季度來(lái)切割一個(gè)分區(qū)﹐歷史資料無(wú)限期保留沒有進(jìn)行歸檔處理。對(duì)表中建立的索引是沒有進(jìn)行分區(qū)處理即是全局性的索引。

系統(tǒng)中分區(qū)運(yùn)用分析﹕

表中資料較大﹐但沒有對(duì)歷史資料進(jìn)行有效的歸檔處理﹐如往年的傳票﹑憑單資料對(duì)現(xiàn)階段的操作應(yīng)沒有很大的關(guān)聯(lián)﹐所以應(yīng)單獨(dú)開立一個(gè)新表進(jìn)行轉(zhuǎn)存。這樣能將這些大表始終控制在一個(gè)范圍范圍大小之中﹐方便日常管理操作

此外﹐這些表中的索引建立的全都是普通型的全局索引﹐對(duì) oltp 來(lái)講這是好的﹐但卻沒有高效利用分區(qū)鍵來(lái)作為索引的一部份且從未在謂詞中將分區(qū)鍵作為條件。所以所有的查詢與 dml操作都是在征對(duì)全分區(qū)進(jìn)行掃描而沒有利用分區(qū)剔除的特性﹐這樣給系統(tǒng)帶來(lái)很多不必要的I/O操作。

所以系統(tǒng)現(xiàn)在所建立的分區(qū)表僅只用到了其中的特性之一﹕高可用性。當(dāng)發(fā)生物理故障時(shí)可以離線某一表空間有限制的對(duì)其它數(shù)據(jù)時(shí)行操作僅此而已。

 

分區(qū)的管理操作

<!--[if !vml]--><!--[endif]-->

分區(qū)管理示例

以下來(lái)示例幾個(gè)常用的分區(qū)管理操作指令﹕

1﹑增加分區(qū)﹕

SQL> create table pp (id  int,nm  char)

  2  partition by range (id)

  3  (partition p1 values less than (10),

  4   partition p11 values less than (20));

 Table created

SQL> alter table pp add partition p111 values less than (30);

Table altered

以上是基于 range 方式分區(qū)的增加

需注意的是分區(qū)的增加只能在最后一個(gè)分區(qū)之后﹐即所界的值必須大于最后一個(gè)分區(qū)的的臨界值﹐這就 add 指令的限定。

SQL> alter table pp2 add partition p111 ;

Table altered

以上是基于 hash 方式分區(qū)的增加﹐只需指定分區(qū)的名稱就可以了。

 

2﹑分區(qū)與表交換。

alter table partitioned

exchange partition fy_1999

with table fy_1999

including indexes

without validation

表示將分區(qū) fy_1999與單獨(dú)表 fy_1999 間的數(shù)據(jù)時(shí)行至換并且包括索引在內(nèi)。

3﹑分區(qū)的滑離

SQL> alter table pp split partition p11 at (15) into (partition sp1,partition sp2);

以上操作僅只能對(duì) range 型態(tài)的分區(qū)表才有用

我們一般會(huì)在建立的分區(qū)表中取最后一個(gè)分區(qū)的臨界值為maxvalue﹐這樣在后續(xù)在操作中如果數(shù)據(jù)范圍變化大的話可以從中滑離出另外的分區(qū)。

所以這樣看來(lái)的話 add split 似乎功能差不多﹐差異在于 split 可以分離另任一個(gè)分區(qū)﹐而 add 僅只能在最后一個(gè)分區(qū)后再新增一個(gè)分區(qū)而已.

 

4drop truncate

這幾類操作同表的操作意思一樣﹑分別表征刪除其不必要的分區(qū)或截?cái)嗄骋环謪^(qū)中的數(shù)據(jù)。

alter table pp drop partitoin sp1

alter table pp truncate  partitoin sp1;

5index 的管理 rebuildunusable

Rebuild 表示當(dāng)對(duì)分區(qū)進(jìn)行某些操作后造成 index 無(wú)效﹐利用 rebuild來(lái)重建這個(gè)分區(qū)索引。Unusable 表示將這個(gè)分區(qū)索引置為無(wú)效。

Alter index idx_par1 rebuild partition p_1;

Alter index idx_part1 unusable partiton p_1;

……….

總結(jié)﹕上述就是分區(qū)的大體內(nèi)容﹐還有很多功能沒有一一列舉﹐可能通來(lái)如google,baidu等網(wǎng)站來(lái)查找相關(guān)方面的內(nèi)容介紹及網(wǎng)友提供的各種技巧﹐在管理和實(shí)踐中提高水平。

後記

   文檔日期:20061101 

---------------------------------------------------------------------------
轉(zhuǎn)載于網(wǎng)上: http://bbs./thread-1764-1-2.html

關(guān)于exchange partition


   exchange partition提供了快速轉(zhuǎn)換普通成分區(qū)表的方法,它通過更新數(shù)據(jù)字典來(lái)實(shí)現(xiàn)分區(qū)與普通表的置換,所以速度相當(dāng)快。
  
  create table t1 as select sysdate dt, all_objects.* from all_objects;
  
  create table t2 as select sysdate dt, all_objects.* from all_objects;
  
  create table t3 as select add_months(sysdate,-24) dt, all_objects.* from all_objects;
  
  create table t( dt, OWNER, OBJECT_NAME, SUBOBJECT_NAME,
  OBJECT_ID, DATA_OBJECT_ID, OBJECT_TYPE, CREATED,
  LAST_DDL_TIME, TIMESTAMP, STATUS, TEMPORARY,
  GENERATED, SECONDARY )
  partition by range(dt) (
  partition part2003 values less than ( to_date( '01-jan-2004',
  'dd-mon-yyyy') ),
  partition part2004 values less than ( to_date( '01-jan-2005',
  'dd-mon-yyyy') ),
  partition part2005 values less than ( to_date( '01-jan-2006',
  'dd-mon-yyyy') )
  )
  as
  select sysdate dt, all_objects.* from all_objects where 1=0;
  /
  
  SQL 10G>set timing on
  SQL 10G>alter table t
   2 exchange partition part2003
   3 with table t3
   4 /
  Table altered.
  Elapsed: 00:00:00.07
  
  SQL 10G>alter table t
   2 exchange partition part2005
   3 with table t1
   4 /
  Table altered.
  Elapsed: 00:00:00.07
  
  
  SQL 10G>alter table t
   2 exchange partition part2004
   3 with table t2
   4 /
  with table t2
        *
  ERROR at line 3:
  ORA-14099: all rows in table do not qualify for specified partition
  
  Elapsed: 00:00:00.00
  
  因?yàn)閠2不符合分區(qū)規(guī)則,所以當(dāng)進(jìn)行exchange將會(huì)報(bào)錯(cuò),我們可以指定without validation子句來(lái)強(qiáng)行禁止oracle檢查合理性
  
  SQL 10G>alter table t
   2 exchange partition part2004
   3 with table t2
   4 without validation
   5 /
  Table altered.
  Elapsed: 00:00:00.03
  
  由于without validation不需要校驗(yàn)數(shù)據(jù)的正確性,所以不會(huì)對(duì)t2做全表掃描,因此exchange的時(shí)間將會(huì)縮短,without validation子句在進(jìn)行大表的exchange時(shí)效率將會(huì)特別高,如果你能確定普通表數(shù)據(jù)的正確性,那么請(qǐng)大膽得使用without validation吧。
  
  我們也可以看一下當(dāng)驗(yàn)證數(shù)據(jù)正確性的時(shí)候oracle內(nèi)部是怎么做的
  
  通過10046 trace events,我們可以看到當(dāng)進(jìn)行exchange partition with validation時(shí)
  
  select 1 from "T1" where TBL$OR$IDX$PART$NUM("T", 0, 3,1048576,"DT") != 58626;
  
  select 1 from "T2" where TBL$OR$IDX$PART$NUM("T", 0, 3,1048576,"DT") != 58625;
  
  select 1 from "T3" where TBL$OR$IDX$PART$NUM("T", 0, 3,1048576,"DT") != 58624;
  
  oracle通過TBL$OR$IDX$PART$NUM函數(shù)來(lái)判斷是否普通表滿足分區(qū)置換的條件
  
  
  SQL 10G>select count(*) from "T1" where TBL$OR$IDX$PART$NUM("T", 0, 3,1048576,"DT") != 58626;
   COUNT(*)
  ----------
       0
  Elapsed: 00:00:00.00
  
  SQL 10G>select count(*) from "T2" where TBL$OR$IDX$PART$NUM("T", 0, 3,1048576,"DT") != 58625;
  
   COUNT(*)
  ----------
     49496
  Elapsed: 00:00:00.04
  
  SQL 10G>select count(*) from "T3" where TBL$OR$IDX$PART$NUM("T", 0, 3,1048576,"DT") != 58624;
  
   COUNT(*)
  ----------
       0
  
  t2是不符合分區(qū)條件的,所以exchange的時(shí)候會(huì)報(bào)
  ORA-14099: all rows in table do not qualify for specified partition

--------------------------------------------------------------------------
http://enjoytime.blog.hexun.com/2741515_d.html

分區(qū)表PARTITION table,以及把已存在數(shù)據(jù)的表轉(zhuǎn)為分區(qū)表。 1.1 分區(qū)表PARTITION table 在ORACLE里如果遇到特別大的表,可以使用分區(qū)的表來(lái)改變其應(yīng)用程序的性能。 1.1.1 分區(qū)表的建立:某公司的每年產(chǎn)生巨大的銷售記錄,DBA向公司建議每季度的數(shù)據(jù)放在一個(gè)分區(qū)內(nèi),以下示范的是該公司1999年的數(shù)據(jù)(假設(shè)每月產(chǎn)生30M的數(shù)據(jù)),操作如下: 范圍分區(qū)表: CREATE TABLE sales (invoice_no NUMBER, ... sale_date DATE NOT NULL ) PARTITION BY RANGE (sale_date) (PARTITION sales1999_q1 VALUES LESS THAN (TO_DATE(‘1999-04-01’,’YYYY-MM-DD’) TABLESPACE ts_sale1999q1, PARTITION sales1999_q2 VALUES LESS THAN (TO_DATE(‘1999-07-01’,’YYYY-MM-DD’) TABLESPACE ts_sale1999q2, PARTITION sales1999_q3 VALUES LESS THAN (TO_DATE(‘1999-10-01’,’YYYY-MM-DD’) TABLESPACE ts_sale1999q3, PARTITION sales1999_q4 VALUES LESS THAN (TO_DATE(‘2000-01-01’,’YYYY-MM-DD’) TABLESPACE ts_sale1999q4 ); --values less than (maxvalue) 列表分區(qū)表: create table emp ( empno number(4), ename varchar2(30), location varchar2(30)) partition by list (location) (partition p1 values ('北京'), partition p2 values ('上海','天津','重慶'), partition p3 values ('廣東','福建') partition p0 values (default) ); 哈希分區(qū): create table emp ( empno number(4), ename varchar2(30), sal number) partition by hash (empno) partitions 8 store in (emp1,emp2,emp3,emp4,emp5,emp6,emp7,emp8); 組合分區(qū):范圍哈希組合分區(qū): create table emp ( empno number(4), ename varchar2(30), hiredate date) partition by range (hiredate) subpartition by hash (empno) subpartitions 2 (partition e1 values less than (to_date('20020501','YYYYMMDD')), partition e2 values less than (to_date('20021001','YYYYMMDD')), partition e3 values less than (maxvalue)); 范圍列表組合分區(qū): CREATE TABLE customers_part ( customer_id NUMBER(6), cust_first_name VARCHAR2(20), cust_last_name VARCHAR2(20), nls_territory VARCHAR2(30), credit_limit NUMBER(9,2)) PARTITION BY RANGE (credit_limit) SUBPARTITION BY LIST (nls_territory) SUBPARTITION TEMPLATE (SUBPARTITION east VALUES ('CHINA', 'JAPAN', 'INDIA', 'THAILAND'), SUBPARTITION west VALUES ('AMERICA', 'GERMANY', 'ITALY', 'SWITZERLAND'), SUBPARTITION other VALUES (DEFAULT)) (PARTITION p1 VALUES LESS THAN (1000), PARTITION p2 VALUES LESS THAN (2500), PARTITION p3 VALUES LESS THAN (MAXVALUE)); create table t1 (id1 number,id2 number) partition by range (id1) subpartition by list (id2) (partition p11 values less than (11) (subpartition subp1 values (1)) ); 1.1.2 分區(qū)表的維護(hù):增加分區(qū): ALTER TABLE sales ADD PARTITION sales2000_q1 VALUES LESS THAN (TO_DATE(‘2000-04-01’,’YYYY-MM-DD’) TABLESPACE ts_sale2000q1; 如果已有maxvalue分區(qū),不能增加分區(qū),可以采取分裂分區(qū)的辦法增加分區(qū)!刪除分區(qū): ALTER TABLE sales DROP PARTION sales1999_q1; 截短分區(qū): alter table sales truncate partiton sales1999_q2; 合并分區(qū): alter table sales merge partitons sales1999_q2, sales1999_q3 into sales1999_q23; 分裂分區(qū): ALTER TABLE sales SPLIT PARTITON sales1999_q4 AT TO_DATE (‘1999-11-01’,’YYYY-MM-DD’) INTO (partition sales1999_q4_p1, partition sales1999_q4_p2) 交換分區(qū): alter table x exchange partition p0 with table bsvcbusrundatald ; 訪問指定分區(qū): select * from sales partition(sales1999_q2) EXPORT指定分區(qū): exp sales/sales_password tables=sales:sales1999_q1 file=sales1999_q1.dmp IMPORT指定分區(qū): imp sales/sales_password FILE =sales1999_q1.dmp TABLES = (sales:sales1999_q1) IGNORE=y 查看分區(qū)信息: user_tab_partitions, user_segments 注:若分區(qū)表跨不同表空間,做導(dǎo)出、導(dǎo)入時(shí)目標(biāo)數(shù)據(jù)庫(kù)必須預(yù)建這些表空間。分表區(qū)各區(qū)所在表空間在做導(dǎo)入時(shí)目標(biāo)數(shù)據(jù)庫(kù)一定要預(yù)建這些表空間!這些表空間不一定是用戶的默認(rèn)表空間,只要存在即可。如果有一個(gè)不存在,就會(huì)報(bào)錯(cuò)!默認(rèn)時(shí),對(duì)分區(qū)表的許多表維護(hù)操作會(huì)使全局索引不可用,標(biāo)記成UNUSABLE。那么就必須重建整個(gè)全局索引或其全部分區(qū)。如果已被分區(qū),Oracle 允許在用于維護(hù)操作的ALTER TABLE 語(yǔ)句中指定UPDATE GLOBAL INDEXES 來(lái)重載這個(gè)默認(rèn)特性,指定這個(gè)子句也就告訴Oracle 當(dāng)它執(zhí)行維護(hù)操作的DDL 語(yǔ)句時(shí)更新全局索引,這提供了如下好處: 1.在操作基礎(chǔ)表的同時(shí)更新全局索引這就不需要后來(lái)單獨(dú)地重建全局索引; 2.因?yàn)闆]有被標(biāo)記成UNUSABLE, 所以全局索引的可用性更高了,甚至正在執(zhí)行分區(qū)的DDL 語(yǔ)句時(shí)仍然可用索引來(lái)訪問表中的其他分區(qū),避免了查詢所有失效的全局索引的名字以便重建它們;另外在指定UPDATE GLOBAL INDEXES 之前還要考慮如下性能因素: 1.因?yàn)橐率孪缺粯?biāo)記成UNUSABLE 的索引,所以分區(qū)的DDL 語(yǔ)句要執(zhí)行更長(zhǎng)時(shí)間,當(dāng)然這要與先不更新索引而執(zhí)行DDL 然后再重建索引所花的時(shí)間做個(gè)比較,一個(gè)適用的規(guī)則是如果分區(qū)的大小小于表的大小的5% ,則更新索引更快一點(diǎn); 2.DROP TRUNCATE 和EXCHANGE 操作也不那么快了,同樣這必須與先執(zhí)行DDL 然后再重建所有全局索引所花的時(shí)間做個(gè)比較; 3.要登記對(duì)索引的更新并產(chǎn)生重做記錄和撤消記錄,重建整個(gè)索引時(shí)可選擇NOLOGGING; 4.重建整個(gè)索引產(chǎn)生一個(gè)更有效的索引,因?yàn)檫@更利于使用空間,再者重建索引時(shí)允許修改存儲(chǔ)選項(xiàng)。注意分區(qū)索引結(jié)構(gòu)表不支持UPDATE GLOBAL INDEXES 子句。 1.1.3 普通表變?yōu)榉謪^(qū)表將已存在數(shù)據(jù)的普通表轉(zhuǎn)變?yōu)榉謪^(qū)表,沒有辦法通過修改屬性的方式直接轉(zhuǎn)化為分區(qū)表,必須通過重建的方式進(jìn)行轉(zhuǎn)變,一般可以有三種方法,視不同場(chǎng)景使用:用例:方法一:利用原表重建分區(qū)表。 CREATE TABLE T (ID NUMBER PRIMARY KEY, TIME DATE); INSERT INTO T SELECT ROWNUM, SYSDATE - ROWNUM FROM DBA_OBJECTS WHERE ROWNUM <= 5000; COMMIT; CREATE TABLE T_NEW (ID, TIME) PARTITION BY RANGE (TIME) (PARTITION P1 VALUES LESS THAN (TO_DATE('2000-1-1', 'YYYY-MM-DD')), PARTITION P2 VALUES LESS THAN (TO_DATE('2002-1-1', 'YYYY-MM-DD')), PARTITION P3 VALUES LESS THAN (TO_DATE('2005-1-1', 'YYYY-MM-DD')), PARTITION P4 VALUES LESS THAN (MAXVALUE)) AS SELECT ID, TIME FROM T; RENAME T TO T_OLD; RENAME T_NEW TO T; SELECT COUNT(*) FROM T; COUNT(*) ---------- 5000 SELECT COUNT(*) FROM T PARTITION (P1); COUNT(*) ---------- 2946 SELECT COUNT(*) FROM T PARTITION (P2); COUNT(*) ---------- 731 SELECT COUNT(*) FROM T PARTITION (P3); COUNT(*) ---------- 1096 優(yōu)點(diǎn):方法簡(jiǎn)單易用,由于采用DDL語(yǔ)句,不會(huì)產(chǎn)生UNDO,且只產(chǎn)生少量REDO,效率相對(duì)較高,而且建表完成后數(shù)據(jù)已經(jīng)在分布到各個(gè)分區(qū)中了。不足:對(duì)于數(shù)據(jù)的一致性方面還需要額外的考慮。由于幾乎沒有辦法通過手工鎖定T表的方式保證一致性,在執(zhí)行CREATE TABLE語(yǔ)句和RENAME T_NEW TO T語(yǔ)句直接的修改可能會(huì)丟失,如果要保證一致性,需要在執(zhí)行完語(yǔ)句后對(duì)數(shù)據(jù)進(jìn)行檢查,而這個(gè)代價(jià)是比較大的。另外在執(zhí)行兩個(gè)RENAME語(yǔ)句之間執(zhí)行的對(duì) T的訪問會(huì)失敗。 適用于修改不頻繁的表,在閑時(shí)進(jìn)行操作,表的數(shù)據(jù)量不宜太大。 方法二:使用交換分區(qū)的方法。 Drop table t; CREATE TABLE T (ID NUMBER PRIMARY KEY, TIME DATE); INSERT INTO T SELECT ROWNUM, SYSDATE - ROWNUM FROM DBA_OBJECTS WHERE ROWNUM <= 5000; COMMIT; CREATE TABLE T_NEW (ID NUMBER PRIMARY KEY, TIME DATE) PARTITION BY RANGE (TIME) (PARTITION P1 VALUES LESS THAN (TO_DATE('2005-9-1', 'YYYY-MM-DD')), PARTITION P2 VALUES LESS THAN (MAXVALUE)); ALTER TABLE T_NEW EXCHANGE PARTITION P1 WITH TABLE T; RENAME T TO T_OLD; RENAME T_NEW TO T; 優(yōu)點(diǎn):只是對(duì)數(shù)據(jù)字典中分區(qū)和表的定義進(jìn)行了修改,沒有數(shù)據(jù)的修改或復(fù)制,效率最高。如果對(duì)數(shù)據(jù)在分區(qū)中的分布沒有進(jìn)一步要求的話,實(shí)現(xiàn)比較簡(jiǎn)單。在執(zhí)行完RENAME操作后,可以檢查T_OLD中是否存在數(shù)據(jù),如果存在的話,直接將這些數(shù)據(jù)插入到T中,可以保證對(duì)T插入的操作不會(huì)丟失。不足:仍然存在一致性問題,交換分區(qū)之后RENAME T_NEW TO T之前,查詢、更新和刪除會(huì)出現(xiàn)錯(cuò)誤或訪問不到數(shù)據(jù)。如果要求數(shù)據(jù)分布到多個(gè)分區(qū)中,則需要進(jìn)行分區(qū)的SPLIT操作,會(huì)增加操作的復(fù)雜度,效率也會(huì)降低。 適用于包含大數(shù)據(jù)量的表轉(zhuǎn)到分區(qū)表中的一個(gè)分區(qū)的操作。應(yīng)盡量在閑時(shí)進(jìn)行操作。 方法三:Oracle9i以上版本,利用在線重定義功能 Drop table t; CREATE TABLE T (ID NUMBER PRIMARY KEY, TIME DATE); INSERT INTO T SELECT ROWNUM, SYSDATE - ROWNUM FROM DBA_OBJECTS WHERE ROWNUM <= 5000; COMMIT; EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE(USER, 'T'); PL/SQL 過程已成功完成。 CREATE TABLE T_NEW (ID NUMBER PRIMARY KEY, TIME DATE) PARTITION BY RANGE (TIME) (PARTITION P1 VALUES LESS THAN (TO_DATE('2004-7-1', 'YYYY-MM-DD')), PARTITION P2 VALUES LESS THAN (TO_DATE('2005-1-1', 'YYYY-MM-DD')), PARTITION P3 VALUES LESS THAN (TO_DATE('2005-7-1', 'YYYY-MM-DD')), PARTITION P4 VALUES LESS THAN (MAXVALUE)); 表已創(chuàng)建。 EXEC DBMS_REDEFINITION.START_REDEF_TABLE(USER, 'T', 'T_NEW'); PL/SQL 過程已成功完成。 EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE(USER, 'T', 'T_NEW'); PL/SQL 過程已成功完成。 SELECT COUNT(*) FROM T; COUNT(*) ---------- 5000 SELECT COUNT(*) FROM T PARTITION (P3); COUNT(*) ---------- 1096 優(yōu)點(diǎn):保證數(shù)據(jù)的一致性,在大部分時(shí)間內(nèi),表T都可以正常進(jìn)行DML操作。只在切換的瞬間鎖表,具有很高的可用性。這種方法具有很強(qiáng)的靈活性,對(duì)各種不同的需要都能滿足。而且,可以在切換前進(jìn)行相應(yīng)的授權(quán)并建立各種約束,可以做到切換完成后不再需要任何額外的管理操作。不足:實(shí)現(xiàn)上比上面兩種略顯復(fù)雜。 適用于各種情況。 這里只給出了在線重定義表的一個(gè)最簡(jiǎn)單的例子,詳細(xì)的描述和例子可以參考下面兩篇文章。 Oracle的在線重定義表功能:http://blog./post/468/12855 Oracle的在線重定義表功能(二):http://blog./post/468/12962 XSB: 把一個(gè)已存在數(shù)據(jù)的大表改成分區(qū)表:第一種(表不是太大): 1.把原表改名: rename xsb1 to xsb2; 2.創(chuàng)建分區(qū)表: CREATE TABLE xsb1 PARTITION BY LIST (c_test) (PARTITION xsb1_p1 VALUES (1), PARTITION xsb1_p2 VALUES (2), PARTITION xsb1_p0 VALUES (default)) nologging AS SELECT * FROM xsb2; 3.將原表上的觸發(fā)器、主鍵、索引等應(yīng)用到分區(qū)表上; 4.刪除原表: drop table xsb2; 第二種(表很大): 1. 創(chuàng)建分區(qū)表: CREATE TABLE x PARTITION BY LIST (c_test) [range ()] (PARTITION p0 VALUES [less than ](1) tablespace tbs1, PARTITION p2 VALUES (2) tablespace tbs1, PARTITION xsb1_p0 VALUES ([maxvalue]default)) AS SELECT * FROM xsb2 [where 1=2]; 2. 交換分區(qū) alter table x exchange partition p0 with table bsvcbusrundatald ; 3. 原表改名alter table bsvcbusrundatald rename to x0; 4. 新表改名alter table x rename to bsvcbusrundatald ; 5. 刪除原表drop table x0; 6. 創(chuàng)建新表觸發(fā)器和索引create index ind_busrundata_lp on bsvcbusrundatald(。。。) local tablespace tbs_brd_ind ; 或者: 1. 規(guī)劃原大表中數(shù)據(jù)分區(qū)的界限,原則上將原表中近期少量數(shù)據(jù)復(fù)制至另一表; 2. 暫停原大表中的相關(guān)觸發(fā)器; 3. 刪除原大表中近期數(shù)據(jù); 4. 改名原大表名稱; 5. 創(chuàng)建分區(qū)表; 6. 交換分區(qū); 7. 重建相關(guān)索引及觸發(fā)器(先刪除之再重建). 參考腳本: select count(*) from t1 where recdate>sysdate-2 create table x2 nologging as select * from t1 where recdate>trunc(sysdate-2) alter triger trg_t1 disable delete t1 where recdate>sysdate-2 commit rename t1 to x1 create table t1 [nologging] partition by range(recdate) (partition pbefore values less than (trunc(sysdate-2)), partition pmax values less than (maxvalue)) as select * from x1 where 1=2 alter table t1 exchange partition pbefore with table x1 alter table t1 exchange partition pmax with table x2 drop table x2 [重建觸發(fā)器] drop table x1 1.1.4 參考材料:如果表中預(yù)期的數(shù)據(jù)量較大,通常都需要考慮使用分區(qū)表,確定使用分區(qū)表后,還要確定什么類型的分區(qū)(range partition、hash partition、list partition等)、分區(qū)區(qū)間大小等。分區(qū)的創(chuàng)建最好與程序有某種默契,偶曾經(jīng)創(chuàng)建分區(qū)表,按自然月份定義分區(qū)的,但程序卻在查詢時(shí)默認(rèn)的開始時(shí)間與結(jié)束時(shí)間是:當(dāng)前日期-30至當(dāng)前日期,比如當(dāng)天是9.18號(hào),那查詢條件被產(chǎn)生為8.18-9.18,結(jié)果分區(qū)后并不沒有大幅提高性能,后來(lái)對(duì)程序的查詢?nèi)掌谧隽苏{(diào)整,按自然月查詢,系統(tǒng)的負(fù)載小了很多。從Oracle8.0開始支持表分區(qū)(MSSQL2005開始支持表分區(qū))。 Oracle9i 分區(qū)能夠提高許多應(yīng)用程序的可管理性、性能與可用性。分區(qū)可以將表、索引及索引編排表進(jìn)一步劃分,從而可以更精細(xì)地對(duì)這些數(shù)據(jù)庫(kù)對(duì)象進(jìn)行管理和訪問。 Oracle 提供了種類繁多的分區(qū)方案以滿足所有的業(yè)務(wù)需要。另外,由于在 SQL 語(yǔ)句中是完全透明的,所以分區(qū)可以用于幾乎所有的應(yīng)用程序。分區(qū)表允許將數(shù)據(jù)分成被稱為分區(qū)甚至子分區(qū)的更小的更好管理的塊。索引也可以這么分區(qū)。每個(gè)分區(qū)可以被單獨(dú)管理,可以不依賴于其他分區(qū)而單獨(dú)發(fā)揮作用,因此提供了一個(gè)更有利于可用性和性能的結(jié)構(gòu)。分區(qū)可以提高可管理性、性能與可用性,從而給各種各樣的應(yīng)用程序帶來(lái)極大的好處。通常,分區(qū)可以使某些查詢以及維護(hù)操作的性能大大提高。此外,分區(qū)還能夠在很大程度上簡(jiǎn)化日常管理任務(wù)。分區(qū)還使數(shù)據(jù)庫(kù)設(shè)計(jì)人員和管理員能夠解決尖端應(yīng)用程序帶來(lái)的最難的問題。分區(qū)是建立上億萬(wàn)字節(jié)數(shù)據(jù)系統(tǒng)或需要極高可用性系統(tǒng)的關(guān)鍵工具。在多CPU配置環(huán)境下,如果打算使用并行執(zhí)行,則分區(qū)提供了另一種并行的方法。通過給表或索引的不同分區(qū)分配不同的并行執(zhí)行服務(wù)器,就可以并行執(zhí)行對(duì)分區(qū)表和分區(qū)索引的操作。表或索引的分區(qū)和子分區(qū)都共享相同的邏輯屬性。例如表的所有分區(qū)或子分區(qū)共享相同的列和約束定義,一個(gè)索引的分區(qū)或子分區(qū)共享相同的索引選項(xiàng)。然而它們可以具有不同的物理屬性如表空間。盡管不需要將表或索引的每個(gè)分區(qū)或子分區(qū)放在不同的表空間,但這樣做更好。將分區(qū)存儲(chǔ)到不同的表空間能夠 l 減少數(shù)據(jù)在多個(gè)分區(qū)中沖突的可能性 l 可以單獨(dú)備份和恢復(fù)每個(gè)分區(qū) l 控制分區(qū)與磁盤驅(qū)動(dòng)器之間的映射對(duì)平衡I/O 負(fù)載是重要的 l 改善可管理性可用性和性能分區(qū)操作對(duì)現(xiàn)存的應(yīng)用和運(yùn)行在分區(qū)表上的標(biāo)準(zhǔn)DML 語(yǔ)句來(lái)說是透明的。但是可以通過在DML 中使用分區(qū)擴(kuò)展表或索引的名字來(lái)對(duì)應(yīng)用編程,使其利用分區(qū)的優(yōu)點(diǎn)。可以使用SQL*Loader、Import 和Export 工具來(lái)裝載或卸載分區(qū)表中的數(shù)據(jù)。這些工具都是支持分區(qū)和子分區(qū)的。分區(qū)的方法 Oracle9i 提供了如下5種分區(qū)方法: l 范圍分區(qū)Range l 散列分區(qū)Hash l 列表分區(qū)List l 組合范圍-散列分區(qū)Range-Hash l 組合范圍-列表分區(qū)Range-List 可對(duì)索引和表分區(qū)。全局索引只能按范圍分區(qū),但可以將其定義在任何類型的分區(qū)或非分區(qū)表上。通常全局索引比局部索引需要更多的維護(hù)。一般組建局部索引,以便反映其基礎(chǔ)表的結(jié)構(gòu)。它與基礎(chǔ)表是等同分區(qū)的,即它與基礎(chǔ)表在同樣的列上分區(qū),創(chuàng)建同樣數(shù)量的分區(qū)或子分區(qū),設(shè)置與基礎(chǔ)表相對(duì)應(yīng)的同樣的分區(qū)邊界。對(duì)局部索引而言,當(dāng)維護(hù)活動(dòng)影響分區(qū)時(shí),會(huì)自動(dòng)維護(hù)索引分區(qū)。這保證了索引與基礎(chǔ)表之間的等同分區(qū)。關(guān)于范圍分區(qū)Range:要想將行映射到基于列值范圍的分區(qū),就使用范圍分區(qū)方法。當(dāng)數(shù)據(jù)可以被劃分成邏輯范圍時(shí)如年度中的月份,這種類型的分區(qū)就有用了。當(dāng)數(shù)據(jù)在整個(gè)范圍中能被均等地劃分時(shí)性能最好。如果靠范圍的分區(qū)會(huì)由于不均等的劃分而導(dǎo)致分區(qū)在大小上明顯不同時(shí),就需要考慮其他的分區(qū)方法。關(guān)于散列分區(qū)Hash:如果數(shù)據(jù)不那么容易進(jìn)行范圍分區(qū),但為了性能和管理的原因又想分區(qū)時(shí),就使用散列分區(qū)方法。散列分區(qū)提供了一種在指定數(shù)量的分區(qū)中均等地劃分?jǐn)?shù)據(jù)的方法。基于分區(qū)鍵的散列值將行映射到分區(qū)中。創(chuàng)建和使用散列分區(qū)會(huì)給你提供了一種很靈活的放置數(shù)據(jù)的方法,因?yàn)槟憧梢酝ㄟ^在I/O 驅(qū)動(dòng)器之間播撒(摘掉)這些均等定量的分區(qū),來(lái)影響可用性和性能。關(guān)于列表分區(qū)List:當(dāng)你需要明確地控制如何將行映射到分區(qū)時(shí),就使用列表分區(qū)方法??梢栽诿總€(gè)分區(qū)的描述中為該分區(qū)列指定一列離散值,這不同于范圍分區(qū),在那里一個(gè)范圍與一個(gè)分區(qū)相關(guān),這也不同于散列分區(qū),在那里用戶不能控制如何將行映射到分區(qū)。列表分區(qū)方法是特意為遵從離散值的模塊化數(shù)據(jù)劃分而設(shè)計(jì)的。范圍分區(qū)或散列分區(qū)不那么容易做到這一點(diǎn)。進(jìn)一步說列表分區(qū)可以非常自然地將無(wú)序的和不相關(guān)的數(shù)據(jù)集進(jìn)行分組和組織到一起。與范圍分區(qū)和散列分區(qū)所不同,列表分區(qū)不支持多列分區(qū)。如果要將表按列分區(qū),那么分區(qū)鍵就只能由表的一個(gè)單獨(dú)的列組成,然而可以用范圍分區(qū)或散列分區(qū)方法進(jìn)行分區(qū)的所有的列,都可以用列表分區(qū)方法進(jìn)行分區(qū)。關(guān)于組合范圍-散列分區(qū):范圍和散列技術(shù)的組合,首先對(duì)表進(jìn)行范圍分區(qū),然后用散列技術(shù)對(duì)每個(gè)范圍分區(qū)再次分區(qū)。給定的范圍分區(qū)的所有子分區(qū)加在一起表示數(shù)據(jù)的邏輯子集。關(guān)于組合范圍-列表分區(qū):范圍和列表技術(shù)的組合,首先對(duì)表進(jìn)行范圍分區(qū),然后用列表技術(shù)對(duì)每個(gè)范圍分區(qū)再次分區(qū)。與組合范圍-散列分區(qū)不同的是,每個(gè)子分區(qū)的所有內(nèi)容表示數(shù)據(jù)的邏輯子集,由適當(dāng)?shù)姆秶土斜矸謪^(qū)設(shè)置來(lái)描述。創(chuàng)建或更改分區(qū)表時(shí)可以指定行移動(dòng)子句,即ENABLE ROW MOVEMENT 或者DISABLE ROW MOVEMENT ,當(dāng)其鍵被更改時(shí),該子句啟用或停用將行遷移到一個(gè)新的分區(qū)。默認(rèn)值為DISABLE ROW MOVEMENT。本產(chǎn)品(項(xiàng)目)使用ENABLE ROW MOVEMENT子句。分區(qū)技術(shù)能夠提高數(shù)據(jù)庫(kù)的可管理性:使用分區(qū)技術(shù),維護(hù)操作可集中于表的特定部分。例如,數(shù)據(jù)庫(kù)管理員可以只對(duì)表的一部分做備份,而不必對(duì)整個(gè)表做備份。對(duì)整個(gè)數(shù)據(jù)庫(kù)對(duì)象的維護(hù)操作,可以在每個(gè)分區(qū)的基礎(chǔ)上進(jìn)行,從而將維護(hù)工作分解成更容易管理的小塊。分區(qū)技術(shù)提高可管理性的一個(gè)典型用法是支持?jǐn)?shù)據(jù)倉(cāng)庫(kù)中的‘滾動(dòng)視窗’加載進(jìn)程。假設(shè)數(shù)據(jù)庫(kù)管理員每周向表中加載新數(shù)據(jù)。該表可以是范圍分區(qū),以便每個(gè)分區(qū)包含一周的數(shù)據(jù)。加載進(jìn)程只是簡(jiǎn)單地添加新的分區(qū)。添加一個(gè)新分區(qū)的操作比修改整個(gè)表效率高很多,因?yàn)閿?shù)據(jù)庫(kù)管理員不需要修改任何其他分區(qū)。從分區(qū)后的表中去除數(shù)據(jù)也是一樣。你只要用一個(gè)很簡(jiǎn)便快捷的數(shù)據(jù)字典操作刪掉一個(gè)分區(qū),而不必發(fā)出使用大量資源和調(diào)動(dòng)所有要?jiǎng)h除的數(shù)據(jù)的 ‘DELETE’ 命令。分區(qū)技術(shù)能夠提高數(shù)據(jù)庫(kù)的性能: 由于減少了所檢查或操作的數(shù)據(jù)數(shù)量,同時(shí)允許并行執(zhí)行,Oracle9i 的分區(qū)功能提供了性能上的優(yōu)勢(shì)。這些性能包括: l 分區(qū)修整:分區(qū)修整是用分區(qū)技術(shù)提高性能的最簡(jiǎn)單最有價(jià)值的手段。分區(qū)修整常常能夠?qū)⒉樵冃阅芴岣邘讉€(gè)數(shù)量級(jí)。例如,假定應(yīng)用程序中有包含定單歷史記錄的定單表,該表用周進(jìn)行了分區(qū)。查詢一周的定單只需訪問該定單表的一個(gè)分區(qū)。如果該定單表包含兩年的歷史記錄,這個(gè)查詢只需要訪問一個(gè)而不是一百零四個(gè)分區(qū)。該查詢的執(zhí)行速度因?yàn)榉謪^(qū)修整而有可能快一百倍。分區(qū)修整能與所有其他 Oracle 性能特性協(xié)作。Oracle 公司將把分區(qū)修整技術(shù)與索引技術(shù)、連結(jié)技術(shù)和并行訪問方法一起聯(lián)合使用。 l 分區(qū)智能聯(lián)接:分區(qū)功能可以通過稱為分區(qū)智能聯(lián)接的技術(shù)提高多表聯(lián)接的性能。當(dāng)兩個(gè)表要聯(lián)接在一起,而且每個(gè)表都用聯(lián)接關(guān)鍵字來(lái)分區(qū)時(shí),就可以使用分區(qū)智能聯(lián)接。分區(qū)智能聯(lián)接將大型聯(lián)接分解成較小的發(fā)生在各個(gè)分區(qū)間的聯(lián)接,從而用較少的時(shí)間完成全部聯(lián)接。這就給串行和并行的執(zhí)行都能帶來(lái)顯著的性能改善。 l 更新和刪除的并行執(zhí)行:分區(qū)功能能夠無(wú)限地并行執(zhí)行 UPDATE、DELETE 與 MERGE 語(yǔ)句。當(dāng)訪問分區(qū)或未分區(qū)的數(shù)據(jù)庫(kù)對(duì)象時(shí)Oracle 將并行處理 SELECT 與 INSERT 語(yǔ)句。當(dāng)不使用位圖索引時(shí),也可以對(duì)分區(qū)或未分區(qū)的數(shù)據(jù)庫(kù)對(duì)象并行處理 UPDATE、DELETE 和 MERGE 語(yǔ)句。為了對(duì)有位圖索引的對(duì)象并行處理那些操作,目標(biāo)表必須先分區(qū)。這些 SQL 語(yǔ)句的并行執(zhí)行可以大大提高性能,特別是提高 UPDATE 與 DELETE 或 MERGE 操作涉及大量數(shù)據(jù)時(shí)的性能。 分區(qū)技術(shù)提高可用性:分區(qū)的數(shù)據(jù)庫(kù)對(duì)象具有分區(qū)獨(dú)立性。該分區(qū)獨(dú)立性特點(diǎn)可能是高可用性戰(zhàn)略的一個(gè)重要部分,例如,如果分區(qū)表的分區(qū)不能用,但該表的所有其他分區(qū)仍然保持在線并可用。那么這個(gè)應(yīng)用程序可以繼續(xù)針對(duì)該分區(qū)表執(zhí)行查詢和事務(wù)處理,只要不是訪問那個(gè)不可用的分區(qū),數(shù)據(jù)庫(kù)操作仍然能夠成功運(yùn)行。數(shù)據(jù)庫(kù)管理員可以指定各分區(qū)存放在不同的表空間里,從而讓管理員獨(dú)立于其它表分區(qū)針對(duì)每個(gè)分區(qū)進(jìn)行備份與恢復(fù)操作。還有,分區(qū)功能可以減少計(jì)劃停機(jī)時(shí)間。性能由于分區(qū)功能得到了改善,使數(shù)據(jù)庫(kù)管理員在相對(duì)較小的批處理窗口完成大型數(shù)據(jù)庫(kù)對(duì)象的維護(hù)工作。


 

 

 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多