oracle分区表总结(转)

上一篇 / 下一篇  2009-05-24 16:17:36 / 个人分类:Oracle

  • 文件版本: V1.0
  • 开发商: 本站原创
  • 文件来源: 本地
  • 界面语言: 简体中文
  • 授权方式: 免费
  • 运行平台: Win9X/Win2000/WinXP

ORACLE里如果遇到特别大的表,可以使用分区的表来改变其应用程序的性能。51Testing软件测试网QoS"ij,`j

/ix`w:_i S0
同事的分区表总结,转载一下。
yD5z3mb0

1.1分区表PARTITION table

ORACLE里如果遇到特别大的表,可以使用分区的表来改变其应用程序的性能。51Testing软件测试网&[H7e{^hWrx

1.1.1分区表的建立:

某公司的每年产生巨大的销售记录,DBA向公司建议每季度的数据放在一个分区内,以下示范的是该公司1999年的数据(假设每月产生30M的数据),操作如下:

i m_+|c1z NZ0

范围分区表:

ChUj;x3b0

CREATE TABLE sales51Testing软件测试网\']?q?H

(invoice_no NUMBER,

tK#Z;M3c"g0

...51Testing软件测试网Ev$uuSsN Glm

sale_date DATE NOT NULL )

1b0l&@/x2S+p8rEu0

PARTITION BY RANGE (sale_date)51Testing软件测试网];bJ1q lU.SU

(PARTITION sales1999_q151Testing软件测试网2Gc.i(xJC!Y;}f*u

VALUES LESS THAN (TO_DATE(1999-04-01,YYYY-MM-DD)51Testing软件测试网B:y2k+Tn7Sa6VA

TABLESPACE ts_sale1999q1,51Testing软件测试网r O2l2gB;|,]A

PARTITION sales1999_q251Testing软件测试网'JeM0\'\D

VALUES LESS THAN (TO_DATE(1999-07-01,YYYY-MM-DD)51Testing软件测试网6~6Z]G.r9tt}(`O

TABLESPACE ts_sale1999q2,51Testing软件测试网!jF7G"LE.O/\"R

PARTITION sales1999_q3

4n]ff#yQ+c n0

VALUES LESS THAN (TO_DATE(1999-10-01,YYYY-MM-DD)

_LIL)x0

TABLESPACE ts_sale1999q3,

*U6_3j2w[6\6X0

PARTITION sales1999_q451Testing软件测试网(?"\8|no

VALUES LESS THAN (TO_DATE(2000-01-01,YYYY-MM-DD)

clG|$[|0

TABLESPACE ts_sale1999q4 );

$d0E@ho0

--values less than (maxvalue)51Testing软件测试网\0v3xF6|bVA{

列表分区表:

#i5^ `v'b({0

create table emp (51Testing软件测试网r?^7}*p VD%[

empno number(4),

C!l6F0T,J4|:w O_0

ename varchar2(30),51Testing软件测试网 U n;_doP]

location varchar2(30))

2?Q WR3lRV0

partition by list (location)

6V|} {c0

(partition p1 values ('北京'),

}6YN7L0o/K;t l0

partition p2 values ('上海','天津','重庆'),51Testing软件测试网B9R)j'U!W8g

partition p3 values ('广东','福建')

7U3w!UO*|2z.qo0

partition p0 values (default)51Testing软件测试网.Er[hc8vL

);

%|E5V^;~F?a)l0

哈希分区:

)yPx%\+lV]z^0

create table emp (

m M9I-t;Bo/K7Tb0

empno number(4),51Testing软件测试网cC8V ~[(f0L

ename varchar2(30),51Testing软件测试网|2FjJJ

sal number)51Testing软件测试网S BwiO;I Q7|(}

partition by hash (empno)51Testing软件测试网"E_Oj7[H6m Y

partitions 851Testing软件测试网Q&^!ff+niW;t^

store in (emp1,emp2,emp3,emp4,emp5,emp6,emp7,emp8);

:?ZL5J)jx0

组合分区:51Testing软件测试网J^2o9WT y @

范围哈希组合分区:51Testing软件测试网2BD|W1k$eIr _"BKw

create table emp (

m i3h a^[(c(D~0

empno number(4),

b"w'Uc.\;o9c0

ename varchar2(30),

5S5A*p&PciK;@5z,` ^P0

hiredate date)51Testing软件测试网Q @9Y1jj

partition by range (hiredate)

.M+Jo'[$Au*@0

subpartition by hash (empno)51Testing软件测试网 H-h0iF^W9j&~B

subpartitions 2

P/g-[P(xh `I0

(partition e1 values less than (to_date('20020501','YYYYMMDD')),

U#z4RG*s2Sz0

partition e2 values less than (to_date('20021001','YYYYMMDD')),

C@.y w0D0

partition e3 values less than (maxvalue));

*qP6Hkt1]3cu0

范围列表组合分区:51Testing软件测试网YGE fU8J rW

CREATE TABLE customers_part (51Testing软件测试网Q i8J-h Kw

customer_id NUMBER(6),

'P$b}5~0Yr @-f*t0

cust_first_name VARCHAR2(20),51Testing软件测试网;O.x\l*B}nK

cust_last_name VARCHAR2(20),

Ps Qc4M:M0

nls_territory VARCHAR2(30),51Testing软件测试网_bhL j q

credit_limit NUMBER(9,2))51Testing软件测试网5\B6M!v"H iR

PARTITION BY RANGE (credit_limit)

y3F+afK9t EP8gU0

SUBPARTITION BY LIST (nls_territory)

8Bl}iZ]8L9X0

SUBPARTITION TEMPLATE51Testing软件测试网 sz(~+piq$d

(SUBPARTITION east VALUES ('CHINA', 'JAPAN', 'INDIA', 'THAILAND'),

Fh{i.z~[w0

SUBPARTITION west VALUES ('AMERICA', 'GERMANY', 'ITALY', 'SWITZERLAND'),

+e2Xrz7U3_&Zo0

SUBPARTITION other VALUES (DEFAULT))

s-y-b[w+Y){0

(PARTITION p1 VALUES LESS THAN (1000),

3g1b0{4aiNg0

PARTITION p2 VALUES LESS THAN (2500),

6ojxkS _0

PARTITION p3 VALUES LESS THAN (MAXVALUE));51Testing软件测试网 zeA/Y3j

create table t1 (id1 number,id2 number)

2wv$Z!j3S @!{9P0

partition by range (id1) subpartition by list (id2)

o0u0Qs2i!L0

(partition p11 values less than (11)51Testing软件测试网0[4nN^Zf

(subpartition subp1 values (1))51Testing软件测试网T/w#B Nj t k7WC

);51Testing软件测试网U,u EQn.D+e9a

索引分区:51Testing软件测试网5W ^:N"}!UU(\#lZo-T;Wj

CREATE INDEX month_ix ON sales(sales_month)51Testing软件测试网 mb*IK6vW:X_
GLOBAL PARTITION BY RANGE(sales_month)
t(^!s)C _p0(PARTITION pm1_ix VALUES LESS THAN (2)51Testing软件测试网(P3BVb&]r(WDl"G
PARTITION pm12_ix VALUES LESS THAN (MAXVALUE));

$Fe4Kd$Z0

1.1.2分区表的维护:

增加分区:

o RP2~ ~8A0

ALTER TABLE sales ADD PARTITION sales2000_q1

%tl5bj$M*?0

VALUES LESS THAN (TO_DATE(2000-04-01,YYYY-MM-DD)51Testing软件测试网Py:eOG-{7[#A\

TABLESPACE ts_sale2000q1;

;f p ZI'k r6q/rv0

如果已有maxvalue分区,不能增加分区,可以采取分裂分区的办法增加分区!51Testing软件测试网I.n)G2{ c*r[6p*N+@w

删除分区:

pD.W4g:v0

ALTER TABLE salesDROP PARTION sales1999_q1;

c"e|e_R1h0

截短分区:51Testing软件测试网kL!G_m d

alter table sales truncate partiton sales1999_q2;

,P.NgANU1Ol0f;|n0

合并分区:

U*FnS,}!J6C_ o!f Z0

alter table sales merge partitons sales1999_q2, sales1999_q3 into sales1999_q23;51Testing软件测试网c&_{O(H

alter index ind_t2 rebuild partition p123 parallel 2;51Testing软件测试网e,c1]8\O:g[(XKqFc^

分裂分区:

c/T8u AUj3eG0

ALTER TABLE sales51Testing软件测试网FVq0\xX?v

SPLIT PARTITON sales1999_q4

9D#m#m\PRm5{&I#I0

AT TO_DATE (1999-11-01,YYYY-MM-DD)

cGQ v(R+z`0

INTO (partition sales1999_q4_p1, partition sales1999_q4_p2) ;51Testing软件测试网x y/C6Z dz8F9d-u.]

alter table t2 split partition p123 values (1,2) into (partition p12,partition p3);

&I6?1c Z6Y0

交换分区:

`6O6^^BG}[I0

alter table x exchange partition p0 with table bsvcbusrundatald ;51Testing软件测试网&v#rjC D

访问指定分区:

i-E"rT e\m3w\0

select * from sales partition(sales1999_q2)51Testing软件测试网sMMsA{7m&I@#_e

EXPORT指定分区:

]V;BY`)bg6]g0

exp sales/sales_password tables=sales:sales1999_q151Testing软件测试网N8B5`1@i9C

file=sales1999_q1.dmp

/C6~8Mg Q'GH|0

IMPORT指定分区:

_!XC%x B-h%OE Hq6u0

imp sales/sales_password FILE =sales1999_q1.dmp51Testing软件测试网e/^O U%j0_;A2m

TABLES = (sales:sales1999_q1) IGNORE=y

3U2GB\o6d+xG#H~w0

查看分区信息:51Testing软件测试网$lG Bdp+`n5si)[

user_tab_partitions, user_segments51Testing软件测试网7W Z5i+zA*F `d

注:若分区表跨不同表空间,做导出、导入时目标数据库必须预建这些表空间。分表区各区所在表空间在做导入时目标数据库一定要预建这些表空间!这些表空间不一定是用户的默认表空间,只要存在即可。如果有一个不存在,就会报错!

-z S7A tdZ/@i?n0

默认时,对分区表的许多表维护操作会使全局索引不可用,标记成UNUSABLE。 那么就必须重建整个全局索引或其全部分区。如果已被分区,Oracle 允许在用于维护操作的ALTER TABLE 语句中指定UPDATE GLOBAL INDEXES 来重载这个默认特性,指定这个子句也就告诉Oracle 当它执行维护操作的DDL 语句时更新全局索引,这提供了如下好处:
zt!CAQ$xH'LQ01.在操作基础表的同时更新全局索引这就不需要后来单独地重建全局索引;
TC7}[x"T(n'S}02.因为没有被标记成UNUSABLE, 所以全局索引的可用性更高了,甚至正在执行分区的DDL 语句时仍然可用索引来访问表中的其他分区,避免了查询所有失效的全局索引的名字以便重建它们;
8D i9k-sms/S|:{0另外在指定UPDATE GLOBAL INDEXES 之前还要考虑如下性能因素:51Testing软件测试网,?\w0hv)C.xWdj&er
1.因为要更新事先被标记成UNUSABLE 的索引,所以分区的DDL 语句要执行更长时间,当然这要与先不更新索引而执行DDL 然后再重建索引所花的时间做个比较,一个适用的规则是如果分区的大小小于表的大小的5% ,则更新索引更快一点;51Testing软件测试网,F,n^6S9Nz
2.DROP TRUNCATE 和EXCHANGE 操作也不那么快了,同样这必须与先执行DDL 然后再重建所有全局索引所花的时间做个比较;51Testing软件测试网p(X0f5|5HY
3.要登记对索引的更新并产生重做记录和撤消记录,重建整个索引时可选择NOLOGGING;51Testing软件测试网 z ?4\S;ucw
4.重建整个索引产生一个更有效的索引,因为这更利于使用空间,再者重建索引时允许修改存储选项。
]&f*VCbR` d0注意分区索引结构表不支持UPDATE GLOBAL INDEXES 子句。
51Testing软件测试网2x$B+^7^a0lmGT"U4P"W2_

1.1.3普通表变为分区表

将已存在数据的普通表转变为分区表,没有办法通过修改属性的方式直接转化为分区表,必须通过重建的方式进行转变,一般可以有三种方法,视不同场景使用:51Testing软件测试网LMRwHC'k ms

用例:

:E/ixWU8f0

方法一:利用原表重建分区表。

-B w_+c-{5g}0

CREATETABLE T (ID NUMBER PRIMARY KEY, TIME DATE);51Testing软件测试网 Lc__+m ? pHUl a
INSERT INTO T51Testing软件测试网Z!p:_$hw#tG
SELECT ROWNUM, SYSDATE - ROWNUM FROM DBA_OBJECTS WHERE ROWNUM <=
5000
;
ODb8c|b'Y6s0COMMIT;

2v*A2\tc0Z'tD0

CREATE TABLE T_NEW (ID, TIME) PARTITION BY RANGE (TIME)
+fk^K] j0(PARTITION P1 VALUES LESS THAN (TO_DATE('2000-1-1', 'YYYY-MM-DD')),51Testing软件测试网 LTX,p+X+f
PARTITION P2 VALUES LESS THAN (TO_DATE('2002-1-1', 'YYYY-MM-DD')),51Testing软件测试网P'm M8Y;S{GL
PARTITION P3 VALUES LESS THAN (TO_DATE('2005-1-1', 'YYYY-MM-DD')),
/[Kv$FdnH Y0PARTITION P4 VALUES LESS THAN (MAXVALUE))
1Br m n~0AS SELECT ID, TIME FROM T;

0Y_JRnU0

RENAME T TO T_OLD;51Testing软件测试网]p Z r zF

RENAME T_NEW TO T;

O\4F#v;E0

SELECT COUNT(*) FROM T;51Testing软件测试网d AJ,Uu$g&o;S

COUNT(*)
M iX%~W/C0----------51Testing软件测试网"{1fN]4xOy-I9dc
5000

3y lO*Qk eB8y0

SELECT COUNT(*) FROM T PARTITION (P1);

6U9D:A,NgP0

COUNT(*)51Testing软件测试网 j*Oy1?#l_ g I
----------51Testing软件测试网Z'b;_,{;y0jz
2946

7kZ^cW0

SELECT COUNT(*) FROM T PARTITION (P2);51Testing软件测试网'{o5Zq1p9F z`"T

COUNT(*)
x O[i A5T0----------51Testing软件测试网?'mZ2Q5W$U^
731

^Mhu.?v0

SELECT COUNT(*) FROM T PARTITION (P3);51Testing软件测试网sy |"f.A\

COUNT(*)51Testing软件测试网4^4[c9r2f1_
----------51Testing软件测试网%Sf4K$S @4F\b
1096

fF n gx2p%r$c0

优点:方法简单易用,由于采用DDL语句,不会产生UNDO,且只产生少量REDO,效率相对较高,而且建表完成后数据已经在分布到各个分区中了。51Testing软件测试网3l-F FWiBitS

不足:对于数据的一致性方面还需要额外的考虑。由于几乎没有办法通过手工锁定T表的方式保证一致性,在执行CREATE TABLE语句和RENAME T_NEW TO T语句直接的修改可能会丢失,如果要保证一致性,需要在执行完语句后对数据进行检查,而这个代价是比较大的。另外在执行两个RENAME语句之间执行的对T的访问会失败。

\dp+S}_0

适用于修改不频繁的表,在闲时进行操作,表的数据量不宜太大。51Testing软件测试网GTKS/yuk6~

方法二:使用交换分区的方法。

MI;]-F3a3?/X2[0

Drop table t;
*J9v(]v@"@bF5B0CREATE
TABLE T (ID NUMBER PRIMARY KEY, TIME DATE);51Testing软件测试网6Nf^u;{Aq L
INSERT INTO T51Testing软件测试网4FC-rEV4A
SELECT ROWNUM, SYSDATE - ROWNUM FROM DBA_OBJECTS WHERE ROWNUM <=
5000
;
#S c C|;p@+Gtv0COMMIT;

{1\#Mc,lVg i0

CREATE TABLE T_NEW (ID NUMBER PRIMARY KEY, TIME DATE) PARTITION BY RANGE (TIME)
t'S!@%H*DJ.QQ0(PARTITION P1 VALUES LESS THAN (TO_DATE('2005-9-1', 'YYYY-MM-DD')),51Testing软件测试网rOG0L [#G%M rN)t-T
PARTITION P2 VALUES LESS THAN (MAXVALUE));

*m9p2y`G-U.eA^(H0

ALTER TABLE T_NEW EXCHANGE PARTITION P1 WITH TABLE T;51Testing软件测试网w:Z7V!a?*n1P:}

RENAME T TO T_OLD;51Testing软件测试网$d(R&j;H$B

RENAME T_NEW TO T;

%[Tt*m {)\B.nv0

优点:只是对数据字典中分区和表的定义进行了修改,没有数据的修改或复制,效率最高。如果对数据在分区中的分布没有进一步要求的话,实现比较简单。在执行完RENAME操作后,可以检查T_OLD中是否存在数据,如果存在的话,直接将这些数据插入到T中,可以保证对T插入的操作不会丢失。

,bwM'H$^P1l$j0

不足:仍然存在一致性问题,交换分区之后RENAME T_NEW TO T之前,查询、更新和删除会出现错误或访问不到数据。如果要求数据分布到多个分区中,则需要进行分区的SPLIT操作,会增加操作的复杂度,效率也会降低。

J y swH'z OfO0

适用于包含大数据量的表转到分区表中的一个分区的操作。应尽量在闲时进行操作。51Testing软件测试网8E C M"y N"XP

方法三:Oracle9i以上版本,利用在线重定义功能

&{#b2f_j0

Drop table t;51Testing软件测试网 H R5SP Xl1x |4F
CREATE
TABLE T (ID NUMBER PRIMARY KEY, TIME DATE);
}l8Jw2y-PQs0INSERT INTO T51Testing软件测试网+U+u+uIW0G5_2f F'n(R
SELECT ROWNUM, SYSDATE - ROWNUM FROM DBA_OBJECTS WHERE ROWNUM <=
5000
;
&fI+A@J8b$U0COMMIT;

2cn"]PSD*G0

EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE(USER, 'T');

.a-T"`g"z0

PL/SQL过程已成功完成。51Testing软件测试网+d j GeM.okZ

CREATE TABLE T_NEW (ID NUMBER PRIMARY KEY, TIME DATE) PARTITION BY RANGE (TIME)
1f+[*ZE%E6j0(PARTITION P1 VALUES LESS THAN (TO_DATE('2004-7-1', 'YYYY-MM-DD')),51Testing软件测试网%k\ OJ3z |X)fD|A
PARTITION P2 VALUES LESS THAN (TO_DATE('2005-1-1', 'YYYY-MM-DD')),
%g&H4v!c.GS"k#N0PARTITION P3 VALUES LESS THAN (TO_DATE('2005-7-1', 'YYYY-MM-DD')),
1H?t7TIN uv0PARTITION P4 VALUES LESS THAN (MAXVALUE));
51Testing软件测试网R*s dfH.D L#P

表已创建。

t+IUU_%x Zd0

EXEC DBMS_REDEFINITION.START_REDEF_TABLE(USER, 'T', 'T_NEW');

9d9{&scJS.^!F0

PL/SQL过程已成功完成。51Testing软件测试网fm)joX]v1YQ.w

EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE(USER, 'T', 'T_NEW');51Testing软件测试网z^W&q%`3k6D%L%H|p

PL/SQL过程已成功完成。

a)l9GY2w0

SELECT COUNT(*) FROM T;

:l t%A8\V4E$z9W0

COUNT(*)51Testing软件测试网7^9L9J(}`
----------51Testing软件测试网C-KlN5nF;Qbo/e2k
5000
51Testing软件测试网:i K ws6Y;L

SELECT COUNT(*) FROM T PARTITION (P3);

b L pT"S0

COUNT(*)51Testing软件测试网4Yc:`l+t4BOwv
----------51Testing软件测试网i.C b;[[-d,y\-m7Y"A!Z
1096
51Testing软件测试网|m7r`-gD vf

优点:保证数据的一致性,在大部分时间内,表T都可以正常进行DML操作。只在切换的瞬间锁表,具有很高的可用性。这种方法具有很强的灵活性,对各种不同的需要都能满足。而且,可以在切换前进行相应的授权并建立各种约束,可以做到切换完成后不再需要任何额外的管理操作。

&ZBjx.d0

不足:实现上比上面两种略显复杂。

Bb7HW V} K:u\0

适用于各种情况。51Testing软件测试网s o r\&_ |A

这里只给出了在线重定义表的一个最简单的例子,详细的描述和例子可以参考下面两篇文章

nZz!L1|V0

Oracle的在线重定义表功能:http://blog.itpub.net/post/468/12855

5xg%[EN0

Oracle的在线重定义表功能(二):http://blog.itpub.net/post/468/1296251Testing软件测试网D:b]}#O ~&`} N S

XSB:

&fI+m+[ Yj0

把一个已存在数据的大表改成分区表:

v^"s-C)e9YD0

第一种(表不是太大):51Testing软件测试网;Z*S3A~Yh S)eg t

1.把原表改名:
c`@'nj0eE~ jF0rename xsb1 to xsb2;
~#e/{0[XO6[7E02.
创建分区表:51Testing软件测试网/l}6Adx9e H
CREATE TABLE xsb1
f.g%}6[)yJe? [~0PARTITION BY LIST (c_test)51Testing软件测试网I-Z+qa9c~
(PARTITION xsb1_p1 VALUES (1),
rHIL/HD t"T0PARTITION xsb1_p2 VALUES (2),51Testing软件测试网A7v~ wp,_
PARTITION xsb1_p0 VALUES (default))
_%N.N[_;i!H7_z5p0nologging AS SELECT * FROM xsb2;51Testing软件测试网B6o2t!|&B!o,EO
3.
将原表上的触发器、主键、索引等应用到分区表上;51Testing软件测试网/IS"C.ut"f i,e7q
4.
删除原表:
f4U+k7X*z1{0drop table xsb2;

%PYz8|P8v l|)|3B0

第二种(表很大)51Testing软件测试网 D-y X*d9q^9p(zD'l

1.创建分区表:51Testing软件测试网J!p~:uqK3W
CREATE TABLE x PARTITION BY LIST (c_test) [range ()]51Testing软件测试网 k7lyzR(W
(PARTITION p0 VALUES [less than ](1) tablespace tbs1,
p!Q6s V!Oha0PARTITION p2 VALUES (2) tablespace tbs1,51Testing软件测试网2s2?k#g(K"n xY ed
PARTITION xsb1_p0 VALUES ([maxvalue]default))
9G$KYhd+Qc]0AS SELECT * FROM xsb2 [where 1=2];
51Testing软件测试网](au+q a|E*{6F

2.交换分区alter table x exchange partition p0 with table bsvcbusrundatald ;

o:z?D*vg%T'y0

3.原表改名alter table bsvcbusrundatald rename to x0;

%m?&xy J$O0

4.新表改名alter table x rename to bsvcbusrundatald ;

$G1_{L7C7Xd:^0

5.删除原表drop table x0;

Db+PR o'~0

6.创建新表触发器和索引create index ind_busrundata_lp on bsvcbusrundatald(。。。) local tablespace tbs_brd_ind ;

+D#F:^2JdT-b(];d6F0

或者:51Testing软件测试网e1i.k8M(qg?bC

1.规划原大表中数据分区的界限,原则上将原表中近期少量数据复制至另一表;

dt+ng['f*E t0

2.暂停原大表中的相关触发器;51Testing软件测试网Q [^-[.[

3.删除原大表中近期数据;

\p qJ.P|${ `0

4.改名原大表名称;

w n:h)zT0

5.创建分区表;51Testing软件测试网F!Kf0C&d

6.交换分区;51Testing软件测试网5R5Y4}\e[+M Z

7.重建相关索引及触发器(先删除之再重建).51Testing软件测试网E$sQ5c%d

参考脚本:51Testing软件测试网M$^!J.P4X`+k

select count(*) from t1 where recdate>sysdate-251Testing软件测试网mI ] h`DzS8aVF!@

create table x2 nologging as select * from t1 where recdate>trunc(sysdate-2)

v'y*w$j+O tLt0

alter triger trg_t1 disable51Testing软件测试网9oD6D"Z~&Z jtH

delete t1 where recdate>sysdate-2

uaG^ qNU0

commit

8pG5SR G6up0

rename t1 to x151Testing软件测试网'?ue:leN F3v

create table t1 [nologging] partition by range(recdate)51Testing软件测试网-V7w9W2j @ k3s

(partition pbefore values less than (trunc(sysdate-2)),51Testing软件测试网 d4^5n)KUGfL6A(GB

partition pmax values less than (maxvalue))

_ pj6|%P pFw}#t0

as select * from x1 where 1=2

b+HQ6{ }A0

alter table t1 exchange partition pbefore with table x1

m+d:\[l^~0

alter table t1 exchange partition pmax with table x251Testing软件测试网 eOra9`._X@"?4l*vE

drop table x251Testing软件测试网!S/|"{'w;kd

[重建触发器]51Testing软件测试网4{+C:L0S5X\ k.u$F]

drop table x151Testing软件测试网B Z|"zZbj(~ yy_

1.1.4参考材料:

如果表中预期的数据量较大通常都需要考虑使用分区表确定使用分区表后还要确定什么类型的分区range partitionhash partitionlist partition、分区区间大小等。分区的创建最好与程序有某种默契,偶曾经创建分区表,按自然月份定义分区的,但程序却在查询时默认的开始时间与结束时间是:当前日期-30至当前日期,比如当天是9.18号,那查询条件被产生为8.18-9.18,结果分区后并不没有大幅提高性能,后来对程序的查询日期做了调整,按自然月查询,系统的负载小了很多。51Testing软件测试网n[-]_&?

Oracle8.0开始支持表分区(MSSQL2005开始支持表分区)。51Testing软件测试网}/@8IS;Y^g

Oracle9i分区能够提高许多应用程序的可管理性、性能与可用性。分区可以将表、索引及索引编排表进一步划分,从而可以更精细地对这些数据库对象进行管理和访问。Oracle提供了种类繁多的分区方案以满足所有的业务需要。另外,由于在SQL语句中是完全透明的,所以分区可以用于几乎所有的应用程序。51Testing软件测试网 ~m8{.UK+?

分区表允许将数据分成被称为分区甚至子分区的更小的更好管理的块。索引也可以这么分区。每个分区可以被单独管理,可以不依赖于其他分区而单独发挥作用,因此提供了一个更有利于可用性和性能的结构。

n)r^ L$z}-f:lwp0

分区可以提高可管理性、性能与可用性,从而给各种各样的应用程序带来极大的好处。通常,分区可以使某些查询以及维护操作的性能大大提高。此外,分区还能够在很大程度上简化日常管理任务。分区还使数据库设计人员和管理员能够解决尖端应用程序带来的最难的问题。分区是建立上亿万字节数据系统或需要极高可用性系统的关键工具。51Testing软件测试网xv8uG-X n-vB!C+ST

在多CPU配置环境下,如果打算使用并行执行,则分区提供了另一种并行的方法。通过给表或索引的不同分区分配不同的并行执行服务器,就可以并行执行对分区表和分区索引的操作。

o_ZZ `q%J(S"z9F0

表或索引的分区和子分区都共享相同的逻辑属性。例如表的所有分区或子分区共享相同的列和约束定义,一个索引的分区或子分区共享相同的索引选项。然而它们可以具有不同的物理属性如表空间。

jsK H.EU0

尽管不需要将表或索引的每个分区或子分区放在不同的表空间,但这样做更好。将分区存储到不同的表空间能够51Testing软件测试网4Z}]${ D&@c R G

l减少数据在多个分区中冲突的可能性51Testing软件测试网t8r;o?:Mk;_'X O

l可以单独备份和恢复每个分区

r8x4SmAe+{M0

l控制分区与磁盘驱动器之间的映射对平衡I/O负载是重要的51Testing软件测试网^6q*zY9@

l改善可管理性可用性和性能

H/f0Z)d}w ^0

分区操作对现存的应用和运行在分区表上的标准DML语句来说是透明的。但是可以通过在DML中使用分区扩展表或索引的名字来对应用编程,使其利用分区的优点。

4ME ?u$mH/fW2sP0

可以使用SQL*LoaderImportExport工具来装载或卸载分区表中的数据。这些工具都是支持分区和子分区的。51Testing软件测试网};c\ |JO h@

分区的方法51Testing软件测试网`#|0Bqp Ab}9da5i

Oracle9i提供了如下5种分区方法:

"~%{-}KRQ6\0

l范围分区Range

3g5\ Eh DM:r@/^b0

l散列分区Hash51Testing软件测试网g&v,r.h?

l列表分区List51Testing软件测试网w vmha

l组合范围-散列分区Range-Hash

p+Z!i.WWywc0

l组合范围-列表分区Range-List

U{R:@g0o] X0

可对索引和表分区。全局索引只能按范围分区,但可以将其定义在任何类型的分区或非分区表上。通常全局索引比局部索引需要更多的维护。

(g;A7Y9|6w\)G)Y0

一般组建局部索引,以便反映其基础表的结构。它与基础表是等同分区的,即它与基础51Testing软件测试网:K `r$Xsk*N{+V]

表在同样的列上分区,创建同样数量的分区或子分区,设置与基础表相对应的同样的分区边界。对局部索引而言,当维护活动影响分区时,会自动维护索引分区。这保证了索引与基础表之间的等同分区。

w-H'c*UJ K0

关于范围分区Range

#b&_/AI}0ay0

要想将行映射到基于列值范围的分区,就使用范围分区方法。当数据可以被划分成逻辑范围时如年度中的月份,这种类型的分区就有用了。当数据在整个范围中能被均等地划分时性能最好。如果靠范围的分区会由于不均等的划分而导致分区在大小上明显不同时,就需要考虑其他的分区方法。51Testing软件测试网h+[k%SJ|

关于散列分区Hash

"X^K,GC0

如果数据不那么容易进行范围分区,但为了性能和管理的原因又想分区时,就使用散列分区方法。散列分区提供了一种在指定数量的分区中均等地划分数据的方法。基于分区键的散列值将行映射到分区中。创建和使用散列分区会给你提供了一种很灵活的放置数据的方法,因为你可以通过在I/O驱动器之间播撒(摘掉)这些均等定量的分区,来影响可用性和性能。

8nV*A Vf2]] n*m0

关于列表分区List51Testing软件测试网uOuv svZRb.{

当你需要明确地控制如何将行映射到分区时,就使用列表分区方法。可以在每个分区的描述中为该分区列指定一列离散值,这不同于范围分区,在那里一个范围与一个分区相关,这也不同于散列分区,在那里用户不能控制如何将行映射到分区。列表分区方法是特意为遵从离散值的模块化数据划分而设计的。范围分区或散列分区不那么容易做到这一点。进一步说列表分区可以非常自然地将无序的和不相关的数据集进行分组和组织到一起。

t9abl+^0

与范围分区和散列分区所不同,列表分区不支持多列分区。如果要将表按列分区,那么分区键就只能由表的一个单独的列组成,然而可以用范围分区或散列分区方法进行分区的所有的列,都可以用列表分区方法进行分区。

EU0`*I0r N)_P)I0

关于组合范围-散列分区:

*ZnN/Js:t+pI0

范围和散列技术的组合,首先对表进行范围分区,然后用散列技术对每个范围分区再次分区。给定的范围分区的所有子分区加在一起表示数据的逻辑子集。51Testing软件测试网f2OP/T Hof

关于组合范围-列表分区:

&g%f;xyvP N0

范围和列表技术的组合,首先对表进行范围分区,然后用列表技术对每个范围分区再次分区。与组合范围-散列分区不同的是,每个子分区的所有内容表示数据的逻辑子集,由适当的范围和列表分区设置来描述。51Testing软件测试网p4i)FC:Gs8[/L

创建或更改分区表时可以指定行移动子句,即ENABLE ROW MOVEMENTDISABLE ROW MOVEMENT,当其键被更改时该子句启用或停用将行迁移到一个新的分区。默认值为DISABLE ROW MOVEMENT。本产品(项目)使用ENABLE ROW MOVEMENT子句。51Testing软件测试网:y&FtvQ[

分区技术能够提高数据库的可管理性:

1K ~Ow8Xy&b*ld0

使用分区技术,维护操作可集中于表的特定部分。例如,数据库管理员可以只对表的一部分做备份,而不必对整个表做备份。对整个数据库对象的维护操作,可以在每个分区的基础上进行,从而将维护工作分解成更容易管理的小块。

V;g:r,{iH{ l0

分区技术提高可管理性的一个典型用法是支持数据仓库中的滚动视窗加载进程。假设数据库管理员每周向表中加载新数据。该表可以是范围分区,以便每个分区包含一周的数据。加载进程只是简单地添加新的分区。添加一个新分区的操作比修改整个表效率高很多,因为数据库管理员不需要修改任何其他分区。从分区后的表中去除数据也是一样。你只要用一个很简便快捷的数据字典操作删掉一个分区,而不必发出使用大量资源和调动所有要删除的数据的‘DELETE’命令。

/t8F:jf%Am#S.p9j0

分区技术能够提高数据库的性能:51Testing软件测试网W,Th5K6VWt0y

由于减少了所检查或操作的数据数量,同时允许并行执行,Oracle9i的分区功能提供了性能上的优势。这些性能包括:

i4C BJ1w]0

l分区修整:分区修整是用分区技术提高性能的最简单最有价值的手段。分区修整常常能够将查询性能提高几个数量级。例如,假定应用程序中有包含定单历史记录的定单表,该表用周进行了分区。查询一周的定单只需访问该定单表的一个分区。如果该定单表包含两年的历史记录,这个查询只需要访问一个而不是一百零四个分区。该查询的执行速度因为分区修整而有可能快一百倍。分区修整能与所有其他Oracle性能特性协作。Oracle公司将把分区修整技术与索引技术、连结技术和并行访问方法一起联合使用。

\.Nq8j:JCT;jE2M0

l分区智能联接:分区功能可以通过称为分区智能联接的技术提高多表联接的性能。当两个表要联接在一起,而且每个表都用联接关键字来分区时,就可以使用分区智能联接。分区智能联接将大型联接分解成较小的发生在各个分区间的联接,从而用较少的时间完成全部联接。这就给串行和并行的执行都能带来显著的性能改善。51Testing软件测试网^.Rek"IL#x"r

l更新和删除的并行执行:分区功能能够无限地并行执行UPDATEDELETEMERGE语句。当访问分区或未分区的数据库对象时Oracle将并行处理SELECTINSERT语句。当不使用位图索引时,也可以对分区或未分区的数据库对象并行处理UPDATEDELETEMERGE语句。为了对有位图索引的对象并行处理那些操作,目标表必须先分区。这些SQL语句的并行执行可以大大提高性能,特别是提高UPDATEDELETEMERGE操作涉及大量数据时的性能。51Testing软件测试网]x8K6S2A{J8y$`

分区技术提高可用性:51Testing软件测试网k-B.Ce"AK@'G

分区的数据库对象具有分区独立性。该分区独立性特点可能是高可用性战略的一个重要部分,例如,如果分区表的分区不能用,但该表的所有其他分区仍然保持在线并可用。那么这个应用程序可以继续针对该分区表执行查询和事务处理,只要不是访问那个不可用的分区,数据库操作仍然能够成功运行。数据库管理员可以指定各分区存放在不同的表空间里,从而让管理员独立于其它表分区针对每个分区进行备份与恢复操作。还有,分区功能可以减少计划停机时间。性能由于分区功能得到了改善,使数据库管理员在相对较小的批处理窗口完成大型数据库对象的维护工作。

tW:Rby&yO0

TAG:

 

评分:0

我来说两句

Open Toolbar