oracle分区表总结(转)

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

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

ORACLE里如果遇到特别大的表,可以使用分区的表来改变其应用程序的性能。
)vw5b@5y-k"n'FR051Testing软件测试网$?b"g{7a jn

同事的分区表总结,转载一下。51Testing软件测试网 evy,J2u0n3?

1.1分区表PARTITION table

ORACLE里如果遇到特别大的表,可以使用分区的表来改变其应用程序的性能。

T#` G h#o5fV ~0

1.1.1分区表的建立:

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

]1s(\!\ Ifc3|l#y0

范围分区表:

6O`&gX @sm1o0

CREATE TABLE sales

KW/X%{:N Z0

(invoice_no NUMBER,51Testing软件测试网u3g+PC%k0^m

...

}u#ecj.W9m*|8T0

sale_date DATE NOT NULL )51Testing软件测试网8MQ;tMn-Cg

PARTITION BY RANGE (sale_date)

?`aNzNX CzWj^0

(PARTITION sales1999_q1

,OTj#hVP/k#T eDuu0

VALUES LESS THAN (TO_DATE(1999-04-01,YYYY-MM-DD)51Testing软件测试网J?#sw*Oz~8DNS

TABLESPACE ts_sale1999q1,

\)zyqk&p0

PARTITION sales1999_q251Testing软件测试网3yTl2TKy^

VALUES LESS THAN (TO_DATE(1999-07-01,YYYY-MM-DD)51Testing软件测试网'v|A d5AI

TABLESPACE ts_sale1999q2,51Testing软件测试网E,S]7jFB/DN

PARTITION sales1999_q351Testing软件测试网,T[8nOH

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

n\dt^}yzr Hc0

TABLESPACE ts_sale1999q3,51Testing软件测试网6s-a}'Y!bB$n

PARTITION sales1999_q451Testing软件测试网 VZnT\&S0~D

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

{N"Z`Yk"^6F jnH0

TABLESPACE ts_sale1999q4 );

0?%O YN2\0

--values less than (maxvalue)51Testing软件测试网/Mv4SMB#{

列表分区表:

4]0s&f*?ZfmYK ~0

create table emp (

a h WI5r`0

empno number(4),

8w {(Z#^;x8`Tn*RG7I Q0

ename varchar2(30),

.ghEZ!G)|0

location varchar2(30))51Testing软件测试网){1o#{Z$ZU${o

partition by list (location)

C)YN5S XSB0

(partition p1 values ('北京'),

6t*Y5P9ki\7P6]H:W0

partition p2 values ('上海','天津','重庆'),51Testing软件测试网6N2bRepM+i a/@

partition p3 values ('广东','福建')51Testing软件测试网@'d&As8wz

partition p0 values (default)51Testing软件测试网z%A:D*I C*A3gk oI

);51Testing软件测试网4?c8V_-q5\ tl

哈希分区:51Testing软件测试网A/b ]mio1];q-i;i

create table emp (

,?aY'fAN7Rc0

empno number(4),51Testing软件测试网W"hjaL\1n[+u

ename varchar2(30),

2Fx_qt-G5B;M9]_0

sal number)

gcl \!Av:Nsu-\0

partition by hash (empno)

'o]#H)x4TN|+pV5R{0

partitions 8

L1\J nu9_0

store in (emp1,emp2,emp3,emp4,emp5,emp6,emp7,emp8);51Testing软件测试网B'W6|%X!i^Nh.\

组合分区:

1r6OJ1_9@fG0

范围哈希组合分区:

Jf1C~P0

create table emp (

s7S9MDA R z0

empno number(4),51Testing软件测试网&@#P0z Z/Pli

ename varchar2(30),51Testing软件测试网y!s%`'ws#\o

hiredate date)51Testing软件测试网~V'w!_6V1o5X

partition by range (hiredate)51Testing软件测试网6W Y2|H` t0Da

subpartition by hash (empno)

f)p rY2iL8?l0

subpartitions 2

#P:cF8HG0

(partition e1 values less than (to_date('20020501','YYYYMMDD')),51Testing软件测试网8A Oe*w)H tL6Zfz7Oq

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

pD"["i,?0

partition e3 values less than (maxvalue));

I GrH D3P+rP@,_0

范围列表组合分区:

-RT!L4G9kV0

CREATE TABLE customers_part (

M8`Bu4I@:hY8C_0

customer_id NUMBER(6),

L w1JZA9r ~9@0

cust_first_name VARCHAR2(20),

o1J.[IF @o?:T0

cust_last_name VARCHAR2(20),

's)O9ru2v2a+s4?0

nls_territory VARCHAR2(30),

B#Ht7av#P?nh8W0

credit_limit NUMBER(9,2))

J6jr$j^0

PARTITION BY RANGE (credit_limit)51Testing软件测试网w^v&Te*p

SUBPARTITION BY LIST (nls_territory)51Testing软件测试网eiWf1Qr-WL

SUBPARTITION TEMPLATE51Testing软件测试网[Pd;h"{+c

(SUBPARTITION east VALUES ('CHINA', 'JAPAN', 'INDIA', 'THAILAND'),51Testing软件测试网3p4Fmy l,~ f+|7hD

SUBPARTITION west VALUES ('AMERICA', 'GERMANY', 'ITALY', 'SWITZERLAND'),51Testing软件测试网 f4o@\E

SUBPARTITION other VALUES (DEFAULT))

R&N8S {p,r0

(PARTITION p1 VALUES LESS THAN (1000),

4Rwvm6B? fE0

PARTITION p2 VALUES LESS THAN (2500),

*nbCg O`j8\0

PARTITION p3 VALUES LESS THAN (MAXVALUE));51Testing软件测试网+Z0nXAwH#Tiqh

create table t1 (id1 number,id2 number)51Testing软件测试网'PEU3}ri

partition by range (id1) subpartition by list (id2)51Testing软件测试网 fx)SW*\ZkQV

(partition p11 values less than (11)51Testing软件测试网 K4qA-Por N

(subpartition subp1 values (1))51Testing软件测试网8M~ _YK6g t&Z8oH0v

);51Testing软件测试网yO{8m I oQ%c

索引分区:

@~} W%|3W0

CREATE INDEX month_ix ON sales(sales_month)
d}/CMR4|0GLOBAL PARTITION BY RANGE(sales_month)51Testing软件测试网C5X X4L p1F T
(PARTITION pm1_ix VALUES LESS THAN (2)
YkKL3ug;\0PARTITION pm12_ix VALUES LESS THAN (MAXVALUE));
51Testing软件测试网"T(~,w:|c s8l]

1.1.2分区表的维护:

增加分区:51Testing软件测试网mb*Y0Z k`%B

ALTER TABLE sales ADD PARTITION sales2000_q151Testing软件测试网kbM5CM:OVa d

VALUES LESS THAN (TO_DATE(2000-04-01,YYYY-MM-DD)51Testing软件测试网Y [p.K/`Lov ~ a

TABLESPACE ts_sale2000q1;51Testing软件测试网 A7o&m%nwC;H0S

如果已有maxvalue分区,不能增加分区,可以采取分裂分区的办法增加分区!51Testing软件测试网8_)Pw+mWi#O

删除分区:

&L@&k\X [h M0

ALTER TABLE salesDROP PARTION sales1999_q1;51Testing软件测试网4NIV$s4Lk E

截短分区:

M)zg_5x!Pp |J0

alter table sales truncate partiton sales1999_q2;51Testing软件测试网q Lr q/_

合并分区:

^.B po5J I \0

alter table sales merge partitons sales1999_q2, sales1999_q3 into sales1999_q23;51Testing软件测试网6mFx zynZ

alter index ind_t2 rebuild partition p123 parallel 2;51Testing软件测试网SG |8d:r

分裂分区:

`7[d'ibx:|3e Ob0

ALTER TABLE sales51Testing软件测试网!o2~)aT:CM{!z

SPLIT PARTITON sales1999_q4

q-D)` I'HwmO0

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

5rl0v l$ij0

INTO (partition sales1999_q4_p1, partition sales1999_q4_p2) ;51Testing软件测试网+T6\,i&Er

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

W }Vy2p5s"?V&L0

交换分区:

&Y_%JtL%j8fx0

alter table x exchange partition p0 with table bsvcbusrundatald ;51Testing软件测试网&O f#[ \_x

访问指定分区:

'T ~ROk5};A C0

select * from sales partition(sales1999_q2)

BG |0Q'G:T2R)d&e0

EXPORT指定分区:

^`2[?-^A0

exp sales/sales_password tables=sales:sales1999_q151Testing软件测试网m Lup S1x

file=sales1999_q1.dmp

FN k/c5gP kg6V`0

IMPORT指定分区:

YJ b f]}(Y,[/H6xR0

imp sales/sales_password FILE =sales1999_q1.dmp51Testing软件测试网-S$r~ I+Ip{

TABLES = (sales:sales1999_q1) IGNORE=y

uI$aV o/K1^!Xz0

查看分区信息:51Testing软件测试网-{+n&S(`9c4Mi/M

user_tab_partitions, user_segments51Testing软件测试网hP)P4t~B%JT

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

;C(U&A}wP)y~O0

默认时,对分区表的许多表维护操作会使全局索引不可用,标记成UNUSABLE。 那么就必须重建整个全局索引或其全部分区。如果已被分区,Oracle 允许在用于维护操作的ALTER TABLE 语句中指定UPDATE GLOBAL INDEXES 来重载这个默认特性,指定这个子句也就告诉Oracle 当它执行维护操作的DDL 语句时更新全局索引,这提供了如下好处:
N,VP9a({A/D n(Y01.在操作基础表的同时更新全局索引这就不需要后来单独地重建全局索引;51Testing软件测试网VK$L am
2.因为没有被标记成UNUSABLE, 所以全局索引的可用性更高了,甚至正在执行分区的DDL 语句时仍然可用索引来访问表中的其他分区,避免了查询所有失效的全局索引的名字以便重建它们;51Testing软件测试网 q{1}Bj F
另外在指定UPDATE GLOBAL INDEXES 之前还要考虑如下性能因素:51Testing软件测试网 x%@"kxdrD
1.因为要更新事先被标记成UNUSABLE 的索引,所以分区的DDL 语句要执行更长时间,当然这要与先不更新索引而执行DDL 然后再重建索引所花的时间做个比较,一个适用的规则是如果分区的大小小于表的大小的5% ,则更新索引更快一点;51Testing软件测试网Rc4\Zq }`,@:t:Q
2.DROP TRUNCATE 和EXCHANGE 操作也不那么快了,同样这必须与先执行DDL 然后再重建所有全局索引所花的时间做个比较;
4T[ g&z`03.要登记对索引的更新并产生重做记录和撤消记录,重建整个索引时可选择NOLOGGING;
;b Q{qGd]8e04.重建整个索引产生一个更有效的索引,因为这更利于使用空间,再者重建索引时允许修改存储选项。51Testing软件测试网'X~-Sr @.E6Q
注意分区索引结构表不支持UPDATE GLOBAL INDEXES 子句。
51Testing软件测试网_ rV(?8_P#Fia?

1.1.3普通表变为分区表

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

用例:51Testing软件测试网 zH&O~3L{'~

方法一:利用原表重建分区表。51Testing软件测试网5oa(v%Y$IOAC5_

CREATETABLE T (ID NUMBER PRIMARY KEY, TIME DATE);51Testing软件测试网f/B {3a8Ko B3K
INSERT INTO T51Testing软件测试网'J2v `!s2Z5iN0F!E w!jp
SELECT ROWNUM, SYSDATE - ROWNUM FROM DBA_OBJECTS WHERE ROWNUM <=
5000
;
/yrDHM2B%h'v`0COMMIT;

N}4V a:dMr V0

CREATE TABLE T_NEW (ID, TIME) PARTITION BY RANGE (TIME)
k"VI2?5L;M]ol]5{0(PARTITION P1 VALUES LESS THAN (TO_DATE('2000-1-1', 'YYYY-MM-DD')),51Testing软件测试网 lh(o KY
PARTITION P2 VALUES LESS THAN (TO_DATE('2002-1-1', 'YYYY-MM-DD')),51Testing软件测试网:U9o+B8q'H.z
PARTITION P3 VALUES LESS THAN (TO_DATE('2005-1-1', 'YYYY-MM-DD')),51Testing软件测试网8?*zQG?1n
PARTITION P4 VALUES LESS THAN (MAXVALUE))
^u ZyDQe0AS SELECT ID, TIME FROM T;

g W*j2D|!S:w0

RENAME T TO T_OLD;51Testing软件测试网kNj7pf-r,H

RENAME T_NEW TO T;51Testing软件测试网%jYw+ne

SELECT COUNT(*) FROM T;

6v,gjC8y$u-[ K8s0

COUNT(*)
\^Sg.t]%g~g0----------51Testing软件测试网"l IuZ?r
5000
51Testing软件测试网 BF8P7[+q?I|/NZ

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

3T$?1u6ik0

COUNT(*)
5U[Ab0AM D0`9F0----------
CL*@&S"H;u5~02946

3t"o3n e|0

SELECT COUNT(*) FROM T PARTITION (P2);51Testing软件测试网2}D8j Fs$CH&G]h

COUNT(*)51Testing软件测试网osk F3d&l
----------51Testing软件测试网CM*j:l3H$mk
731
51Testing软件测试网o"NqEq+N~x+~?.P2N

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

^+U+LW3`Z+d3D)?0

COUNT(*)51Testing软件测试网 g3paLN5L
----------51Testing软件测试网3zw&T LU6r5q
1096

5HeiD7]|0

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

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

+|(YQ1hqxXP6s0

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

方法二:使用交换分区的方法。51Testing软件测试网7Y}OF-])Oa

Drop table t;
L h-h|+g2y0CREATE
TABLE T (ID NUMBER PRIMARY KEY, TIME DATE);51Testing软件测试网0pR,d#]4LeL
INSERT INTO T51Testing软件测试网(] wve6dH
SELECT ROWNUM, SYSDATE - ROWNUM FROM DBA_OBJECTS WHERE ROWNUM <=
5000
;
!D/E"Y6]}0COMMIT;

3};t(ku7y4[0

CREATE TABLE T_NEW (ID NUMBER PRIMARY KEY, TIME DATE) PARTITION BY RANGE (TIME)
;~r"t+[B0(PARTITION P1 VALUES LESS THAN (TO_DATE('2005-9-1', 'YYYY-MM-DD')),
+fePn1{Hr"_]Y0PARTITION P2 VALUES LESS THAN (MAXVALUE));
51Testing软件测试网]'o2hx0[ _Z\

ALTER TABLE T_NEW EXCHANGE PARTITION P1 WITH TABLE T;51Testing软件测试网OGF@]WD4H/W?

RENAME T TO T_OLD;51Testing软件测试网s*t A4a*n9YC$`L

RENAME T_NEW TO T;

-~&Af P7[D @6Ty0

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

5n+yO mF%xK0

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

适用于包含大数据量的表转到分区表中的一个分区的操作。应尽量在闲时进行操作。51Testing软件测试网\1I w4S6mxg

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

\%FrC9b+Y&~T g0

Drop table t;
*P/ao-c~T ru|m0CREATE
TABLE T (ID NUMBER PRIMARY KEY, TIME DATE);51Testing软件测试网6fW"JV3G4H.h8t8k
INSERT INTO T
S o]LOX.Io0SELECT ROWNUM, SYSDATE - ROWNUM FROM DBA_OBJECTS WHERE ROWNUM <=
5000
;51Testing软件测试网O{ q\i,\ZA Z0b*c
COMMIT;
51Testing软件测试网"}1ri!g5Q?*{K0N

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

psG @8B0

PL/SQL过程已成功完成。51Testing软件测试网)Lk H#@fKsR

CREATE TABLE T_NEW (ID NUMBER PRIMARY KEY, TIME DATE) PARTITION BY RANGE (TIME)51Testing软件测试网$_f4xH6`*K
(PARTITION P1 VALUES LESS THAN (TO_DATE('2004-7-1', 'YYYY-MM-DD')),
\QJp,s"y0PARTITION P2 VALUES LESS THAN (TO_DATE('2005-1-1', 'YYYY-MM-DD')),51Testing软件测试网y+ANc K4bt`
PARTITION P3 VALUES LESS THAN (TO_DATE('2005-7-1', 'YYYY-MM-DD')),
]z d,DCB0PARTITION P4 VALUES LESS THAN (MAXVALUE));
51Testing软件测试网 }BgW3z(d I4Y L

表已创建。

~-M^*TDM5TyF0w0

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

fV,h"Uh0

PL/SQL过程已成功完成。

Xm?#n[1k+tL;J0

EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE(USER, 'T', 'T_NEW');51Testing软件测试网w*w~Zl?6f M0o/?

PL/SQL过程已成功完成。

7v(Z-Q.y d0

SELECT COUNT(*) FROM T;

*j9xT\#|:R.| C)lx#l0

COUNT(*)51Testing软件测试网Q5~ YS)d1I N ^ X%fO&S%A
----------51Testing软件测试网F#EYS Y#RJl`
5000

'z;v!vd+eaG0

SELECT COUNT(*) FROM T PARTITION (P3);51Testing软件测试网$Z7~0FMC4~w_A;s&d-h

COUNT(*)51Testing软件测试网H mru&`'W1?+mq'D9H
----------51Testing软件测试网(JB~+S yMR]]
1096

{?Q~+t-uR/m?0

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

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

;^\S8vN[.`0

适用于各种情况。51Testing软件测试网~4pDn;r_M

这里只给出了在线重定义表的一个最简单的例子,详细的描述和例子可以参考下面两篇文章51Testing软件测试网 ?)o([t1h2Z^

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

:N Zg,`)_#P0

Oracle的在线重定义表功能(二):http://blog.itpub.net/post/468/12962

_#vo#H#D*H0

XSB:

CU#k.QD5@*A0

把一个已存在数据的大表改成分区表:51Testing软件测试网1HFvbC

第一种(表不是太大):

3e8k%x l0Ft"o0

1.把原表改名:
&xy f,@i){0rename xsb1 to xsb2;51Testing软件测试网y0eUh-f:Y{P
2.
创建分区表:51Testing软件测试网:@:tCDr)|lQ{
CREATE TABLE xsb1
laLZ'E+v1F0PARTITION BY LIST (c_test)51Testing软件测试网9[ Z7xM]0w!x
(PARTITION xsb1_p1 VALUES (1),
!q`@"ePI0PARTITION xsb1_p2 VALUES (2),51Testing软件测试网r e2T hg&@[
PARTITION xsb1_p0 VALUES (default))51Testing软件测试网3v'V:Wm&O
nologging AS SELECT * FROM xsb2;51Testing软件测试网*buuL5Q+s
3.
将原表上的触发器、主键、索引等应用到分区表上;
Z&H z]W\%Sz04.
删除原表:51Testing软件测试网WMl{Sv
drop table xsb2;

4[Z2V'k7bN-|_3?F-^0

第二种(表很大)

H1kit`0

1.创建分区表:
@}dM!j q yx0CREATE TABLE x PARTITION BY LIST (c_test) [range ()]51Testing软件测试网-P0WX] Q7b)k"W
(PARTITION p0 VALUES [less than ](1) tablespace tbs1,51Testing软件测试网'~ yL Uh
PARTITION p2 VALUES (2) tablespace tbs1,
'r VD}2}Ln0PARTITION xsb1_p0 VALUES ([maxvalue]default))51Testing软件测试网eaUP cGdfe
AS SELECT * FROM xsb2 [where 1=2];

I,i3v4BF+} x!_c#|T0

2.交换分区alter table x exchange partition p0 with table bsvcbusrundatald ;51Testing软件测试网b2RZM[ y-pv

3.原表改名alter table bsvcbusrundatald rename to x0;51Testing软件测试网C9s:Up0H\)s

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

sC6s0I1a0

5.删除原表drop table x0;

%KEsK Wk[6Mn0

6.创建新表触发器和索引create index ind_busrundata_lp on bsvcbusrundatald(。。。) local tablespace tbs_brd_ind ;51Testing软件测试网'KnV'Bm9KbE]_

或者:51Testing软件测试网ELK?o*g1|SM

1.规划原大表中数据分区的界限,原则上将原表中近期少量数据复制至另一表;51Testing软件测试网%CKc9fA8j,h mA

2.暂停原大表中的相关触发器;51Testing软件测试网"n\#BPjZ

3.删除原大表中近期数据;51Testing软件测试网6`f(M,@1hR!}M f~5n

4.改名原大表名称;51Testing软件测试网1T5N0[:K8kO2C

5.创建分区表;

3z$bc7t gV0

6.交换分区;

"h([:Q [h'CV0

7.重建相关索引及触发器(先删除之再重建).

??z(y[Iq0

参考脚本:51Testing软件测试网)x3{5D g)B,d K

select count(*) from t1 where recdate>sysdate-2

d Bw5l p H^tJ0

create table x2 nologging as select * from t1 where recdate>trunc(sysdate-2)51Testing软件测试网z*e)S8jr{-s s)YT

alter triger trg_t1 disable51Testing软件测试网Xe-l;z!M:Or

delete t1 where recdate>sysdate-251Testing软件测试网3gz`[^D B s7o

commit51Testing软件测试网 {(`5aj*[:u6~

rename t1 to x151Testing软件测试网Z6d8n;tBCKN

create table t1 [nologging] partition by range(recdate)

}/d\8u Tov0

(partition pbefore values less than (trunc(sysdate-2)),51Testing软件测试网3sA6}`&cr

partition pmax values less than (maxvalue))

~4uc$N3CTK0

as select * from x1 where 1=251Testing软件测试网c2A&Y s Pd

alter table t1 exchange partition pbefore with table x1

4b$}#Ole9]+bS0

alter table t1 exchange partition pmax with table x251Testing软件测试网(I/fz ?nk

drop table x2

"h L'\Y dac1X xm$J0

[重建触发器]51Testing软件测试网e!|-E/S-XJ7}

drop table x151Testing软件测试网yY;_XQu~#V1N

1.1.4参考材料:

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

Oracle8.0开始支持表分区(MSSQL2005开始支持表分区)。51Testing软件测试网;jNx%xA}g.J'}H

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

分区表允许将数据分成被称为分区甚至子分区的更小的更好管理的块。索引也可以这么分区。每个分区可以被单独管理,可以不依赖于其他分区而单独发挥作用,因此提供了一个更有利于可用性和性能的结构。51Testing软件测试网D)KM t w;T6`

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

6~&P,vKP{5v1o7{0

在多CPU配置环境下,如果打算使用并行执行,则分区提供了另一种并行的方法。通过给表或索引的不同分区分配不同的并行执行服务器,就可以并行执行对分区表和分区索引的操作。51Testing软件测试网9dZ jw$m C/P

表或索引的分区和子分区都共享相同的逻辑属性。例如表的所有分区或子分区共享相同的列和约束定义,一个索引的分区或子分区共享相同的索引选项。然而它们可以具有不同的物理属性如表空间。51Testing软件测试网 t~!j!~Qm#nZh

尽管不需要将表或索引的每个分区或子分区放在不同的表空间,但这样做更好。将分区存储到不同的表空间能够

:MU(E[['X0

l减少数据在多个分区中冲突的可能性51Testing软件测试网,w v*f8bQ9j&yA

l可以单独备份和恢复每个分区51Testing软件测试网 K(RlrD&uPw

l控制分区与磁盘驱动器之间的映射对平衡I/O负载是重要的51Testing软件测试网4W5tpY:Uo

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

uoq yB1UIY0

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

9[7Y T%Fa0

可以使用SQL*LoaderImportExport工具来装载或卸载分区表中的数据。这些工具都是支持分区和子分区的。51Testing软件测试网`&W-Lz:ln"eG

分区的方法51Testing软件测试网SEU&r2Iu;?

Oracle9i提供了如下5种分区方法:51Testing软件测试网'r,G{Twg

l范围分区Range51Testing软件测试网$P}iv,G0eD9fpZ

l散列分区Hash51Testing软件测试网+A'M9h l8_

l列表分区List51Testing软件测试网ylR5j;Pw)B&O

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

\8zvT+f0

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

{h.q XmR4?)B0

可对索引和表分区。全局索引只能按范围分区,但可以将其定义在任何类型的分区或非分区表上。通常全局索引比局部索引需要更多的维护。51Testing软件测试网%O H+?p1tp6FiD

一般组建局部索引,以便反映其基础表的结构。它与基础表是等同分区的,即它与基础51Testing软件测试网5`9zk{fQ

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

3xw,Y!h;BQ vv(A0

关于范围分区Range51Testing软件测试网%da}"b'e)iq+s5z"t

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

8F9dx%?W&J:Wi2Ie0

关于散列分区Hash

I)s? wO4^0\,\0

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

kW ?b*IUX0] \0

关于列表分区List51Testing软件测试网2o1T Z{~Th&m _ L7n)W8G

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

0|(vOTBjy9|0l cw0

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

d4|-zf5mQr(IS0

关于组合范围-散列分区:51Testing软件测试网6St^ G m _

范围和散列技术的组合,首先对表进行范围分区,然后用散列技术对每个范围分区再次分区。给定的范围分区的所有子分区加在一起表示数据的逻辑子集。51Testing软件测试网 `/nG U(O-f n[-o

关于组合范围-列表分区:51Testing软件测试网!{cV:A8~{Qg]

范围和列表技术的组合,首先对表进行范围分区,然后用列表技术对每个范围分区再次分区。与组合范围-散列分区不同的是,每个子分区的所有内容表示数据的逻辑子集,由适当的范围和列表分区设置来描述。51Testing软件测试网}_:}f I#x{ pP

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

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

Sd/["rWnkR7v0

使用分区技术,维护操作可集中于表的特定部分。例如,数据库管理员可以只对表的一部分做备份,而不必对整个表做备份。对整个数据库对象的维护操作,可以在每个分区的基础上进行,从而将维护工作分解成更容易管理的小块。51Testing软件测试网Y@5H8`2}_ u

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

;zdm(eg Ex;O0

分区技术能够提高数据库的性能:51Testing软件测试网j.pd V{*?Au

由于减少了所检查或操作的数据数量,同时允许并行执行,Oracle9i的分区功能提供了性能上的优势。这些性能包括:51Testing软件测试网g-PH0L2Tt if

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

DtMn4e0

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

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

分区技术提高可用性:51Testing软件测试网ez5?+u|#l

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

/HT BFw qa0

TAG:

 

评分:0

我来说两句

Open Toolbar