ORACLE ·ÖÇø±í PARTITION table
ÉÏһƪ / ÏÂһƪ 2008-07-31 16:34:42 / ¸öÈË·ÖÀࣺOracle
------------------------
From:
http://blog.chinaunix.net/u/6889/showart_315897.html
1.1·ÖÇø±íPARTITION table
ÔÚORACLEÀïÈç¹ûÓöµ½Ìرð´óµÄ±í£¬¿ÉÒÔʹÓ÷ÖÇøµÄ±íÀ´¸Ä±äÆäÓ¦ÓóÌÐòµÄÐÔÄÜ¡£
1.1.1·ÖÇø±íµÄ½¨Á¢£º
ij¹«Ë¾µÄÿÄê²úÉú¾Þ´óµÄÏúÊۼǼ£¬DBAÏò¹«Ë¾½¨Òéÿ¼¾¶ÈµÄÊý¾Ý·ÅÔÚÒ»¸ö·ÖÇøÄÚ£¬ÒÔÏÂʾ·¶µÄÊǸù«Ë¾1999ÄêµÄÊý¾Ý(¼ÙÉèÿÔ²úÉú30MµÄÊý¾Ý)£¬²Ù×÷ÈçÏ£º
·¶Î§·ÖÇø±í£º
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)
Áбí·ÖÇø±í£º
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)
);
¹þÏ£·ÖÇø£º
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);
×éºÏ·ÖÇø£º
·¶Î§¹þÏ£×éºÏ·ÖÇø£º
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));
·¶Î§Áбí×éºÏ·ÖÇø£º
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))
);
Ë÷Òý·ÖÇø£º
CREATE INDEX month_ix ON sales(sales_month)ITPUB¸öÈ˿ռäx4^5RZes{
GLOBAL PARTITION BY RANGE(sales_month)ITPUB¸öÈ˿ռäQ2KH(xiW&?*[
(PARTITION pm1_ix VALUES LESS THAN (2)
b:N"u/_L[6h R%`0PARTITION pm12_ix VALUES LESS THAN (MAXVALUE));
1.1.2·ÖÇø±íµÄά»¤£º
Ôö¼Ó·ÖÇø£º
ALTER TABLE sales ADD PARTITION sales2000_q1
VALUES LESS THAN (TO_DATE(¡®2000-04-01¡¯,¡¯YYYY-MM-DD¡¯)
TABLESPACE ts_sale2000q1;
Èç¹ûÒÑÓÐmaxvalue·ÖÇø£¬²»ÄÜÔö¼Ó·ÖÇø£¬¿ÉÒÔ²ÉÈ¡·ÖÁÑ·ÖÇøµÄ°ì·¨Ôö¼Ó·ÖÇø£¡
ɾ³ý·ÖÇø£º
ALTER TABLE salesDROP PARTION sales1999_q1;
½Ø¶Ì·ÖÇø:
alter table sales truncate partiton sales1999_q2;
ºÏ²¢·ÖÇø£º
alter table sales merge partitons sales1999_q2, sales1999_q3 into sales1999_q23;
alter index ind_t2 rebuild partition p123 parallel 2;
·ÖÁÑ·ÖÇø£º
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) ;
alter table t2 split partition p123 values (1,2) into (partition p12,partition p3);
½»»»·ÖÇø:
alter table x exchange partition p0 with table bsvcbusrundatald ;
·ÃÎÊÖ¸¶¨·ÖÇø£º
select * from sales partition(sales1999_q2)
EXPORTÖ¸¶¨·ÖÇø£º
exp sales/sales_password tables=sales:sales1999_q1
file=sales1999_q1.dmp
IMPORTÖ¸¶¨·ÖÇø£º
imp sales/sales_password FILE =sales1999_q1.dmp
TABLES = (sales:sales1999_q1) IGNORE=y
²é¿´·ÖÇøÐÅÏ¢£º
user_tab_partitions, user_segments
×¢£ºÈô·ÖÇø±í¿ç²»Í¬±í¿Õ¼ä£¬×öµ¼³ö¡¢µ¼ÈëʱĿ±êÊý¾Ý¿â±ØÐëÔ¤½¨ÕâЩ±í¿Õ¼ä¡£·Ö±íÇø¸÷ÇøËùÔÚ±í¿Õ¼äÔÚ×öµ¼ÈëʱĿ±êÊý¾Ý¿âÒ»¶¨ÒªÔ¤½¨ÕâЩ±í¿Õ¼ä£¡ÕâЩ±í¿Õ¼ä²»Ò»¶¨ÊÇÓû§µÄĬÈϱí¿Õ¼ä£¬Ö»Òª´æÔÚ¼´¿É¡£Èç¹ûÓÐÒ»¸ö²»´æÔÚ£¬¾Í»á±¨´í£¡
ĬÈÏʱ£¬¶Ô·ÖÇø±íµÄÐí¶à±íά»¤²Ù×÷»áʹȫ¾ÖË÷Òý²»¿ÉÓ㬱ê¼Ç³ÉUNUSABLE¡£ ÄÇô¾Í±ØÐëÖØ½¨Õû¸öÈ«¾ÖË÷Òý»òÆäÈ«²¿·ÖÇø¡£Èç¹ûÒѱ»·ÖÇø£¬Oracle ÔÊÐíÔÚÓÃÓÚά»¤²Ù×÷µÄALTER TABLE Óï¾äÖÐÖ¸¶¨UPDATE GLOBAL INDEXES À´ÖØÔØÕâ¸öĬÈÏÌØÐÔ£¬Ö¸¶¨Õâ¸ö×Ó¾äÒ²¾Í¸æËßOracle µ±ËüÖ´ÐÐά»¤²Ù×÷µÄDDL Óï¾äʱ¸üÐÂÈ«¾ÖË÷Òý£¬ÕâÌṩÁËÈçϺô¦£º
#}-EZ O#y1y2^HL01.ÔÚ²Ù×÷»ù´¡±íµÄͬʱ¸üÐÂÈ«¾ÖË÷ÒýÕâ¾Í²»ÐèÒªºóÀ´µ¥¶ÀµØÖؽ¨È«¾ÖË÷Òý£»ITPUB¸öÈ˿ռä0WTna;}6j5^!_
2.ÒòΪûÓб»±ê¼Ç³ÉUNUSABLE£¬ ËùÒÔÈ«¾ÖË÷ÒýµÄ¿ÉÓÃÐÔ¸ü¸ßÁË£¬ÉõÖÁÕýÔÚÖ´ÐзÖÇøµÄDDL Óï¾äʱÈÔÈ»¿ÉÓÃË÷ÒýÀ´·ÃÎʱíÖÐµÄÆäËû·ÖÇø,±ÜÃâÁ˲éѯËùÓÐʧЧµÄÈ«¾ÖË÷ÒýµÄÃû×ÖÒÔ±ãÖØ½¨ËüÃÇ£»ITPUB¸öÈ˿ռä:?X)F.aH8`:A
ÁíÍâÔÚÖ¸¶¨UPDATE GLOBAL INDEXES ֮ǰ»¹Òª¿¼ÂÇÈçÏÂÐÔÄÜÒòËØ:ITPUB¸öÈ˿ռäk q*Z+Pg^N
1.ÒòΪҪ¸üÐÂÊÂÏȱ»±ê¼Ç³ÉUNUSABLE µÄË÷Òý£¬ËùÒÔ·ÖÇøµÄDDL Óï¾äÒªÖ´Ðиü³¤Ê±¼ä£¬µ±È»ÕâÒªÓëÏȲ»¸üÐÂË÷Òý¶øÖ´ÐÐDDL È»ºóÔÙÖØ½¨Ë÷ÒýËù»¨µÄʱ¼ä×ö¸ö±È½Ï£¬Ò»¸öÊÊÓõĹæÔòÊÇÈç¹û·ÖÇøµÄ´óССÓÚ±íµÄ´óСµÄ5% £¬Ôò¸üÐÂË÷Òý¸ü¿ìÒ»µã£»
CF5KQ*tMBHj02.DROP TRUNCATE ºÍEXCHANGE ²Ù×÷Ò²²»ÄÇô¿ìÁË£¬Í¬ÑùÕâ±ØÐëÓëÏÈÖ´ÐÐDDL È»ºóÔÙÖØ½¨ËùÓÐÈ«¾ÖË÷ÒýËù»¨µÄʱ¼ä×ö¸ö±È½Ï£»
"d]1?Pojl/m03.ÒªµÇ¼Ç¶ÔË÷ÒýµÄ¸üв¢²úÉúÖØ×ö¼Ç¼ºÍ³·Ïû¼Ç¼£¬Öؽ¨Õû¸öË÷Òýʱ¿ÉÑ¡ÔñNOLOGGING£»
T:TI$T?
]C%T8e04.ÖØ½¨Õû¸öË÷Òý²úÉúÒ»¸ö¸üÓÐЧµÄË÷Òý£¬ÒòΪÕâ¸üÀûÓÚʹÓÿռ䣬ÔÙÕßÖØ½¨Ë÷ÒýʱÔÊÐíÐ޸Ĵ洢ѡÏî¡£ITPUB¸öÈ˿ռäaQl7g:n*Q4s
×¢Òâ·ÖÇøË÷Òý½á¹¹±í²»Ö§³ÖUPDATE GLOBAL INDEXES ×Ӿ䡣
1.1.3ÆÕͨ±í±äΪ·ÖÇø±í
½«ÒÑ´æÔÚÊý¾ÝµÄÆÕͨ±íת±äΪ·ÖÇø±í£¬Ã»Óа취ͨ¹ýÐÞ¸ÄÊôÐԵķ½Ê½Ö±½Óת»¯Îª·ÖÇø±í£¬±ØÐëͨ¹ýÖØ½¨µÄ·½Ê½½øÐÐת±ä£¬Ò»°ã¿ÉÒÔÓÐÈýÖÖ·½·¨£¬ÊÓ²»Í¬³¡¾°Ê¹Óãº
ÓÃÀý£º
·½·¨Ò»£ºÀûÓÃÔ±íÖØ½¨·ÖÇø±í¡£
CREATETABLE T (ID NUMBER PRIMARY KEY, TIME DATE);ITPUB¸öÈ˿ռä {Exdj7HGbyz
INSERT INTO TITPUB¸öÈ˿ռägb*t%E&r4Q\]
SELECT ROWNUM, SYSDATE - ROWNUM FROM DBA_OBJECTS WHERE ROWNUM <=5000;ITPUB¸öÈ˿ռäL%@bz e
COMMIT;
CREATE TABLE T_NEW (ID, TIME) PARTITION BY RANGE (TIME)ITPUB¸öÈ˿ռä$jz`b"YP;vk
(PARTITION P1 VALUES LESS THAN (TO_DATE('2000-1-1', 'YYYY-MM-DD')),
FipOJ$I
H"S0PARTITION P2 VALUES LESS THAN (TO_DATE('2002-1-1', 'YYYY-MM-DD')),
)jaI4c+XI)dq[ i0PARTITION P3 VALUES LESS THAN (TO_DATE('2005-1-1', 'YYYY-MM-DD')),
/P7w1Z(hdK%Y}k0PARTITION P4 VALUES LESS THAN (MAXVALUE))
'wo0m}c:^$P9P0AS SELECT ID, TIME FROM T;
RENAME T TO T_OLD;
RENAME T_NEW TO T;
SELECT COUNT(*) FROM T;
COUNT(*)
:p+UNq2XEZ;wz0----------
p\%[WF0[ PUE05000
SELECT COUNT(*) FROM T PARTITION (P1);
COUNT(*)
yO&UpXX0----------ITPUB¸öÈ˿ռäi/Aaqhm C$xlW
2946
SELECT COUNT(*) FROM T PARTITION (P2);
COUNT(*)ITPUB¸öÈ˿ռä2Xa*MPO8f
----------ITPUB¸öÈ˿ռäi'w/i-Cx.wL1HS]Y
731
SELECT COUNT(*) FROM T PARTITION (P3);
COUNT(*)
g_ o4H0oq7QU0----------ITPUB¸öÈ˿ռä"I:_uK/p"JmB5J5c
1096
Óŵ㣺·½·¨¼òµ¥Ò×Óã¬ÓÉÓÚ²ÉÓÃDDLÓï¾ä£¬²»»á²úÉúUNDO£¬ÇÒÖ»²úÉúÉÙÁ¿REDO£¬Ð§ÂÊÏà¶Ô½Ï¸ß£¬¶øÇÒ½¨±íÍê³ÉºóÊý¾ÝÒѾÔÚ·Ö²¼µ½¸÷¸ö·ÖÇøÖÐÁË¡£
²»×㣺¶ÔÓÚÊý¾ÝµÄÒ»ÖÂÐÔ·½Ã滹ÐèÒª¶îÍâµÄ¿¼ÂÇ¡£ÓÉÓÚ¼¸ºõûÓа취ͨ¹ýÊÖ¹¤Ëø¶¨T±íµÄ·½Ê½±£Ö¤Ò»ÖÂÐÔ£¬ÔÚÖ´ÐÐCREATE TABLEÓï¾äºÍRENAME T_NEW TO TÓï¾äÖ±½ÓµÄÐ޸ĿÉÄܻᶪʧ£¬Èç¹ûÒª±£Ö¤Ò»ÖÂÐÔ£¬ÐèÒªÔÚÖ´ÐÐÍêÓï¾äºó¶ÔÊý¾Ý½øÐмì²é£¬¶øÕâ¸ö´ú¼ÛÊDZȽϴóµÄ¡£ÁíÍâÔÚÖ´ÐÐÁ½¸öRENAMEÓï¾äÖ®¼äÖ´ÐеĶÔTµÄ·ÃÎÊ»áʧ°Ü¡£
ÊÊÓÃÓÚÐ޸IJ»Æµ·±µÄ±í£¬ÔÚÏÐʱ½øÐвÙ×÷£¬±íµÄÊý¾ÝÁ¿²»ÒËÌ«´ó¡£
·½·¨¶þ£ºÊ¹Óý»»»·ÖÇøµÄ·½·¨¡£
Drop table t;
^.w5y&EIsJ0L!?9r0CREATETABLE T (ID NUMBER PRIMARY KEY, TIME DATE);ITPUB¸öÈ˿ռä}spa.n {
INSERT INTO TITPUB¸öÈ˿ռä}:g6hI8H1gJ8U
SELECT ROWNUM, SYSDATE - ROWNUM FROM DBA_OBJECTS WHERE ROWNUM <=5000;
3l#BsG`'@M&\0COMMIT;
CREATE TABLE T_NEW (ID NUMBER PRIMARY KEY, TIME DATE) PARTITION BY RANGE (TIME)ITPUB¸öÈ˿ռäQ"Y!yw9h_~p
(PARTITION P1 VALUES LESS THAN (TO_DATE('2005-9-1', 'YYYY-MM-DD')),ITPUB¸öÈ˿ռä.r S&E)I2gD
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;
Óŵ㣺ֻÊǶÔÊý¾Ý×ÖµäÖзÖÇøºÍ±íµÄ¶¨Òå½øÐÐÁËÐ޸ģ¬Ã»ÓÐÊý¾ÝµÄÐ޸Ļò¸´ÖÆ£¬Ð§ÂÊ×î¸ß¡£Èç¹û¶ÔÊý¾ÝÔÚ·ÖÇøÖеķֲ¼Ã»ÓнøÒ»²½ÒªÇóµÄ»°£¬ÊµÏֱȽϼòµ¥¡£ÔÚÖ´ÐÐÍêRENAME²Ù×÷ºó£¬¿ÉÒÔ¼ì²éT_OLDÖÐÊÇ·ñ´æÔÚÊý¾Ý£¬Èç¹û´æÔڵϰ£¬Ö±½Ó½«ÕâЩÊý¾Ý²åÈëµ½TÖУ¬¿ÉÒÔ±£Ö¤¶ÔT²åÈëµÄ²Ù×÷²»»á¶ªÊ§¡£
²»×㣺ÈÔÈ»´æÔÚÒ»ÖÂÐÔÎÊÌ⣬½»»»·ÖÇøÖ®ºóRENAME T_NEW TO T֮ǰ£¬²éѯ¡¢¸üкÍɾ³ý»á³öÏÖ´íÎó»ò·ÃÎʲ»µ½Êý¾Ý¡£Èç¹ûÒªÇóÊý¾Ý·Ö²¼µ½¶à¸ö·ÖÇøÖУ¬ÔòÐèÒª½øÐзÖÇøµÄSPLIT²Ù×÷£¬»áÔö¼Ó²Ù×÷µÄ¸´ÔÓ¶È£¬Ð§ÂÊÒ²»á½µµÍ¡£
ÊÊÓÃÓÚ°üº¬´óÊý¾ÝÁ¿µÄ±íתµ½·ÖÇø±íÖеÄÒ»¸ö·ÖÇøµÄ²Ù×÷¡£Ó¦¾¡Á¿ÔÚÏÐʱ½øÐвÙ×÷¡£
·½·¨Èý£ºOracle9iÒÔÉϰ汾£¬ÀûÓÃÔÚÏßÖØ¶¨Ò幦ÄÜ
Drop table t;
W)_;c)am)[zp7J9QT0CREATETABLE T (ID NUMBER PRIMARY KEY, TIME DATE);ITPUB¸öÈ˿ռä9sr%N
hp
INSERT INTO TITPUB¸öÈ˿ռäoYP8mZ+Q^i'P
SELECT ROWNUM, SYSDATE - ROWNUM FROM DBA_OBJECTS WHERE ROWNUM <=5000;ITPUB¸öÈ˿ռä~8| Y|4tun
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)ITPUB¸öÈ˿ռä
?-_v*YM\*o0Z]e,cC
(PARTITION P1 VALUES LESS THAN (TO_DATE('2004-7-1', 'YYYY-MM-DD')),ITPUB¸öÈ˿ռä&p
i/I9rSpU
PARTITION P2 VALUES LESS THAN (TO_DATE('2005-1-1', 'YYYY-MM-DD')),
VdT#yae)Fn0PARTITION P3 VALUES LESS THAN (TO_DATE('2005-7-1', 'YYYY-MM-DD')),
]
XA0V ~y0PARTITION P4 VALUES LESS THAN (MAXVALUE));
±íÒÑ´´½¨¡£
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(*)ITPUB¸öÈ˿ռäKzO3r+}2Z
----------
2~+s7x%@ ZumL(v05000
SELECT COUNT(*) FROM T PARTITION (P3);
COUNT(*)
n |xck}P p@0----------ITPUB¸öÈ˿ռät%eTu'bi
1096
Óŵ㣺±£Ö¤Êý¾ÝµÄÒ»ÖÂÐÔ£¬Ôڴ󲿷Öʱ¼äÄÚ£¬±íT¶¼¿ÉÒÔÕý³£½øÐÐDML²Ù×÷¡£Ö»ÔÚÇл»µÄ˲¼äËø±í£¬¾ßÓкܸߵĿÉÓÃÐÔ¡£ÕâÖÖ·½·¨¾ßÓкÜÇ¿µÄÁé»îÐÔ£¬¶Ô¸÷ÖÖ²»Í¬µÄÐèÒª¶¼ÄÜÂú×ã¡£¶øÇÒ£¬¿ÉÒÔÔÚÇл»Ç°½øÐÐÏàÓ¦µÄÊÚȨ²¢½¨Á¢¸÷ÖÖÔ¼Êø£¬¿ÉÒÔ×öµ½Çл»Íê³Éºó²»ÔÙÐèÒªÈκζîÍâµÄ¹ÜÀí²Ù×÷¡£
²»×㣺ʵÏÖÉϱÈÉÏÃæÁ½ÖÖÂÔÏÔ¸´ÔÓ¡£
ÊÊÓÃÓÚ¸÷ÖÖÇé¿ö¡£
ÕâÀïÖ»¸ø³öÁËÔÚÏßÖØ¶¨Òå±íµÄÒ»¸ö×î¼òµ¥µÄÀý×Ó£¬ÏêϸµÄÃèÊöºÍÀý×Ó¿ÉÒԲο¼ÏÂÃæÁ½ÆªÎÄÕ¡£
OracleµÄÔÚÏßÖØ¶¨Òå±í¹¦ÄÜ£ºhttp://blog.itpub.net/post/468/12855
OracleµÄÔÚÏßÖØ¶¨Òå±í¹¦ÄÜ£¨¶þ£©£ºhttp://blog.itpub.net/post/468/12962
XSB:°ÑÒ»¸öÒÑ´æÔÚÊý¾ÝµÄ´ó±í¸Ä³É·ÖÇø±í£º
µÚÒ»ÖÖ£¨±í²»ÊÇÌ«´ó£©£º
1.°ÑÔ±í¸ÄÃû£º
o,V_N,J\4R.z0rename xsb1 to xsb2;
ChmLC02.´´½¨·ÖÇø±í£ºITPUB¸öÈ˿ռä-tx1`2Mc,{#v0HJcf P4S
CREATE TABLE xsb1ITPUB¸öÈ˿ռä0yagJygd s)P
PARTITION BY LIST (c_test)