/**根据区分表空间建表**/
CREATE TABLE MYDB
(SID NUMBER(2) PRIMARY KEY,
SNAME CHAR(5) NOT NULL,
SPHONE NUMBER(11) NULL,
SADDR VARCHAR2(10) DEFAULT '广东')
PARTITION BY LIST (SADDR)--列表分区:根据某个字段的具体值分区(list)
(PARTITION PA_ADD1 VALUES ('广东') TABLESPACE SYSTEM,
PARTITION PA_ADD2 VALUES ('广西') TABLESPACE USERS
)
CREATE TABLE MYDB
(SID NUMBER(2) PRIMARY KEY,
SNAME CHAR(5) NOT NULL,
SPHONE NUMBER(11) NULL,
SADDR VARCHAR2(10) DEFAULT '广东')
PARTITION BY RANGE (SID)--范围分区:根据某个字段在某个范围内进行分区(range...less)
(PARTITION PA_ADD1 VALUES LESS THAN(100) TABLESPACE SYSTEM,--list than
PARTITION PA_ADD2 VALUES LESS THAN(MAXVALUE) TABLESPACE USERS
)
CREATE TABLE MYDB
(SID NUMBER(2) PRIMARY KEY,
SNAME CHAR(5) NOT NULL,
SPHONE NUMBER(11) NULL,
SADDR VARCHAR2(10) DEFAULT '广东')
PARTITION BY HASH (SID)--散列分区:根据字段的hash值进行均匀分布(hash)
(PARTITION PA_ADD1 TABLESPACE SYSTEM,
PARTITION PA_ADD2 TABLESPACE USERS
)
/**
简写
建议分区的数量采用2的n次方,这样可以使得各个分区间数据分布更加均匀。
PARTITION BY HASH (SID) PARTITIONS 4(分区数) STORE IN (SP1,SP2,SP3,SP4);
**/
CREATE TABLE MYDB
(SID NUMBER(2) PRIMARY KEY,
SNAME CHAR(5) NOT NULL,
SPHONE NUMBER(11) NULL,
SADDR VARCHAR2(10) DEFAULT '广东')
PARTITION BY RANGE (SADRR) SUBPARTITION BY LIST (SID)--复合分区(范围+散列、范围+列表)
(PARTITION PA_ID1 VALUES LESS THAN(100) TABLESPACE SP1
(
SUBPARTITIONS PA_ADRR1 VALUES('广东') TABLESPACE SP1,
SUBPARTITIONS PA_ADRR2 VALUES('广西') TABLESPACE SP1
)
PARTITION PA_ID2 VALUES LESS THAN(MAXVALUE) TABLESPACE SP1
(
SUBPARTITIONS PA_ADRR3 VALUES('广东') TABLESPACE SP1,
SUBPARTITIONS PA_ADRR4 VALUES('广西') TABLESPACE SP1
)
)
--拆分分区(sblit)
alter table tb_name sblit partition p2 at () into (partition p11,partition p22);
ALTER TABLE SALES SBLIT PARTITION P2 AT(TO_DATE('2003-02-01','YYYY-MM-DD')) INTO (PARTITION P21,PARTITION P22);
--合并分区、MERGE(融入的意思)
alter table tb_name merge partitions sp1,sp2 into partition sp2;
ALTER TABLE TB_NAME MERGE PARTITIONS SP1,SP2 INTO PARTITION SP2;
--接合分区(只用于散列分区中)(coalesca)
alter table tb_name coalesca partitiion;
ALTER TABLE SALES COALESCA PARTITION;
--重名名分区(rename partition...to...)
alter table tb_name rename partition sp1 to sp2;
--查询某个表存在的分区信息
select * from user_tab_partitions where table_name='tb_name';
--使用union实现跨分区查询
--alter table tab_name truncate partition p_name; 清除表中某个分区的信息(截断分区 )
--練習
--查看表分區信息
select * from user_tab_partitions where table_name='stues';
--班級表
create table classes (
cid number(6) primary key,
cnum number(10) unique,
cname varchar(10) not null,
cmax_age number(2),
cmin_age number(2),
csex number(1) default 1--性別1女2男
)
partition by list(csex)(
partition class_sex_l01 values(1) tablespace users,
partition class_sex_l02 values(2) tablespace users
)
select * from classes partition(class_sex_l01);
--學生表
create table stues (
sid number(6),
snum number(10),
sname varchar(10) not null,
sage number(2),
ssex number(1) default 1,
scid number(6),
constraint pk_con primary key(sid),
constraint un_con unique(snum),
constraint ck_age_con check (sage between 1 and 99),
constraint ck_sex_con check (ssex between 1 and 2),
constraint fk_con foreign key(scid) references classes(cid)
) partition by range(sage)(
partition class_age_r01 values less than(30) tablespace users,
partition class_age_r02 values less than(60) tablespace users,
partition class_age_r03 values less than(99) tablespace users
)
select * from stues partition(class_age_r02);
select to_date(2454084+TRUNC(DBMS_RANDOM.VALUE(0,365)),'J') from dual;
select cast('123' as number(5)) from dual;
select cast(dbms_random.value as varchar2(38)) from dual;
--根据区分表空间建表(例子)
CREATE TABLE MYDB
(SID NUMBER(2) PRIMARY KEY,
SNAME CHAR(5) NOT NULL,
SPHONE NUMBER(11) NULL,
SADDR VARCHAR2(10) DEFAULT '广东')
PARTITION BY LIST (SADDR)--列表分区
(PARTITION PA_ADD1 VALUES ('广东') TABLESPACE SYSTEM,
PARTITION PA_ADD2 VALUES ('广西') TABLESPACE USERS
)
ALTER TABLE MYDB
MODIFY (SNAME VARCHAR2(10) );
ALTER TABLE MYDB
MODIFY (SADDR DEFAULT '广东广州' );
ALTER TABLE MYDB
MOVE TABLESPACE USERS;--移动表到其他表空间(索引会失效!)
select * from user_tab_partitions where table_name='mydb'; --查看表的分區信息