oracle表分区实操训练
? ? ? ? 關(guān)于網(wǎng)上oracle表分區(qū)介紹的的文檔有很多(不過(guò)大概看了下基本都是一個(gè)模板刻出來(lái)的),看完后自己實(shí)際操練了下,雖然以前的項(xiàng)目中也用過(guò),但是自己并沒(méi)有參與弄過(guò),今天就在本機(jī)的庫(kù)上爽了一把。
操練環(huán)境:
一個(gè)表(電子簽章人員信息表)有20多萬(wàn)條數(shù)據(jù),重新建個(gè)一模一樣的表,并對(duì)此新表進(jìn)行表分區(qū)設(shè)計(jì)
操練技能:
主要是對(duì)復(fù)合分區(qū)的練習(xí),首先對(duì)日期進(jìn)行范圍分區(qū),再對(duì)分區(qū)進(jìn)行列表字分區(qū)。
實(shí)操代碼:
1、創(chuàng)建存量數(shù)據(jù)表(里面有實(shí)際數(shù)據(jù))
-- Create table create table ESSC_USER (user_id VARCHAR2(255) not null,aac002 VARCHAR2(22),aac003 VARCHAR2(255),aac067 VARCHAR2(255),sign_no VARCHAR2(255),sign_seq VARCHAR2(255),channel_no VARCHAR2(255),aab301 VARCHAR2(255),sign_level VARCHAR2(255),region_name VARCHAR2(255),valid_date VARCHAR2(10),sign_date VARCHAR2(10),bind_channel VARCHAR2(20) ) tablespace USERSpctfree 10initrans 1maxtrans 255storage(initial 64next 1minextents 1maxextents unlimited); -- Add comments to the columns comment on column ESSC_USER.aac002is '身份證號(hào)碼'; comment on column ESSC_USER.aac003is '姓名'; comment on column ESSC_USER.sign_nois '簽發(fā)號(hào)'; comment on column ESSC_USER.sign_seqis '簽發(fā)序列'; comment on column ESSC_USER.channel_nois '簽發(fā)渠道'; comment on column ESSC_USER.aab301is '行政區(qū)劃'; comment on column ESSC_USER.sign_levelis '簽發(fā)等級(jí)'; comment on column ESSC_USER.sign_dateis '簽發(fā)日期'; -- Create/Recreate indexes create index INDEX_AAB301_3 on ESSC_USER (AAB301, SIGN_DATE, CHANNEL_NO)tablespace USERSpctfree 10initrans 2maxtrans 255storage(initial 8Mnext 1Mminextents 1maxextents unlimited); create index INDEX_AAC002 on ESSC_USER (AAC002)tablespace USERSpctfree 10initrans 2maxtrans 255storage(initial 7Mnext 1Mminextents 1maxextents unlimited); -- Create/Recreate primary, unique and foreign key constraints alter table ESSC_USERadd primary key (USER_ID)using index tablespace USERSpctfree 10initrans 2maxtrans 255storage(initial 64Knext 1Mminextents 1maxextents unlimited);2、創(chuàng)建實(shí)操訓(xùn)練表
(1)范圍分區(qū)
//根據(jù)簽發(fā)日期來(lái)分區(qū) CREATE TABLE essc_user_copy PARTITION BY RANGE (SIGN_DATE) (PARTITION date_01 VALUES LESS THAN (20181001) TABLESPACE CP3,PARTITION date_02 VALUES LESS THAN (20191001) TABLESPACE CP3,PARTITION date_03 VALUES LESS THAN (MAXVALUE) TABLESPACE CP3)AS SELECT * FROM essc_user where 1=2 注意:由于本表中的SIGN_DATE字段是varchar2類型的,所以直接寫日期格式,如果各位童鞋的類型是日期型則使用下列的方式轉(zhuǎn)換一下:TO_DATE('20180101','YYYYMMDD')CREATE TABLE essc_user_copy PARTITION BY RANGE (SIGN_DATE) (PARTITION date_01 VALUES LESS THAN (TO_DATE('20180101','YYYYMMDD')) TABLESPACE CP3,PARTITION date_02 VALUES LESS THAN (TO_DATE('20190101','YYYYMMDD')) TABLESPACE CP3,PARTITION date_03 VALUES LESS THAN (MAXVALUE) TABLESPACE CP3)AS SELECT * FROM essc_user where 1=2(2)列表分區(qū)
//根據(jù)簽發(fā)等級(jí)來(lái)分區(qū)CREATE TABLE essc_user_copy partition by list(sign_level)(partition pur120000 values ('1'),partition pur150000 values ('2'))AS SELECT * FROM essc_user where 1=2(3)組合分區(qū)
//先根據(jù)日期范圍分區(qū),在根據(jù)簽發(fā)登記進(jìn)行子分區(qū) CREATE TABLE essc_user_copy PARTITION BY RANGE(SIGN_DATE) SUBPARTITION BY LIST (sign_level)(PARTITION date_01 VALUES LESS THAN(20181001) ( SUBPARTITION SIGN_LEVEL1 VALUES ('1'), SUBPARTITION SIGN_LEVEL2 VALUES ('2') ), PARTITION date_02 VALUES LESS THAN (20191001) ( SUBPARTITION SIGN_LEVEL3 VALUES ('1'), SUBPARTITION SIGN_LEVEL4 VALUES ('2') ), PARTITION date_03 VALUES LESS THAN (MAXVALUE) ( SUBPARTITION SIGN_LEVEL5 VALUES ('1'), SUBPARTITION SIGN_LEVEL6 VALUES ('2') ) )AS SELECT * FROM essc_user where 1=2 注意:對(duì)于日期范圍分區(qū)的時(shí)候根據(jù)其類型進(jìn)行相應(yīng)的轉(zhuǎn)換3、注意項(xiàng)
(1)各分區(qū)的名字不能相同,否則會(huì)報(bào)錯(cuò)。
(2)根據(jù)設(shè)定的分區(qū),插入的數(shù)據(jù)必須在此分區(qū)范圍內(nèi),如果不在則報(bào)錯(cuò)如下:
(3)表分區(qū)和表空間是兩個(gè)不同的概念,在分區(qū)過(guò)程中每個(gè)分區(qū)默認(rèn)可以寫該表所在的表空間,也可寫不同的表空間,表空間是實(shí)際的物理分配。如果不寫則默認(rèn)會(huì)有一個(gè)表空間USER
4、表分區(qū)后的常用查詢操作
(1)查詢相應(yīng)分區(qū)的數(shù)據(jù)
//全表查詢 SELECT COUNT(USER_ID) FROM essc_user_copy; //分區(qū)查詢 SELECT COUNT(USER_ID) FROM essc_user_copy PARTITION(date_02); //子分區(qū)查詢 SELECT COUNT(USER_ID) FROM essc_user_copy SUBPARTITION(SIGN_LEVEL6);(2)查詢分區(qū)情況
/*查詢表上有多少分區(qū)*/ SELECT * FROM useR_TAB_PARTITIONS WHERE TABLE_NAME='essc_user_copy' /*顯示數(shù)據(jù)庫(kù)所有分區(qū)表的信息:*/ SELECT * FROM DBA_PART_TABLES /*顯示當(dāng)前用戶可訪問(wèn)的所有分區(qū)表信息:*/ SELECT * FROM ALL_PART_TABLES /*顯示當(dāng)前用戶所有分區(qū)表的信息:*/ SELECT * FROM USER_PART_TABLES /*顯示表分區(qū)信息 顯示數(shù)據(jù)庫(kù)所有分區(qū)表的詳細(xì)分區(qū)信息:*/ SELECT * FROM DBA_TAB_PARTITIONS /*顯示當(dāng)前用戶可訪問(wèn)的所有分區(qū)表的詳細(xì)分區(qū)信息:*/ SELECT * FROM ALL_TAB_PARTITIONS /*顯示當(dāng)前用戶所有分區(qū)表的詳細(xì)分區(qū)信息:*/ SELECT * FROM USER_TAB_PARTITIONS /*顯示子分區(qū)信息 顯示數(shù)據(jù)庫(kù)所有組合分區(qū)表的子分區(qū)信息:*/ SELECT * FROM DBA_TAB_SUBPARTITIONS /*顯示當(dāng)前用戶可訪問(wèn)的所有組合分區(qū)表的子分區(qū)信息:*/ SELECT * FROM ALL_TAB_SUBPARTITIONS /*顯示當(dāng)前用戶所有組合分區(qū)表的子分區(qū)信息:*/ SELECT * FROM USER_TAB_SUBPARTITIONS /*顯示分區(qū)列 顯示數(shù)據(jù)庫(kù)所有分區(qū)表的分區(qū)列信息:*/ SELECT * FROM DBA_PART_KEY_COLUMNS /*顯示當(dāng)前用戶可訪問(wèn)的所有分區(qū)表的分區(qū)列信息:*/ SELECT * FROM ALL_PART_KEY_COLUMNS /*顯示當(dāng)前用戶所有分區(qū)表的分區(qū)列信息:*/ SELECT * FROM USER_PART_KEY_COLUMNS /*顯示子分區(qū)列 顯示數(shù)據(jù)庫(kù)所有分區(qū)表的子分區(qū)列信息:*/ SELECT * FROM DBA_SUBPART_KEY_COLUMNS /*顯示當(dāng)前用戶可訪問(wèn)的所有分區(qū)表的子分區(qū)列信息:*/ SELECT * FROM ALL_SUBPART_KEY_COLUMNS /*顯示當(dāng)前用戶所有分區(qū)表的子分區(qū)列信息:*/ SELECT * FROM USER_SUBPART_KEY_COLUMNS /*怎樣查詢出oracle數(shù)據(jù)庫(kù)中所有的的分區(qū)表*/ SELECT * FROM user_tables a where a.partitioned='YES' /*刪除一個(gè)表的數(shù)據(jù)*/ truncate table table_name; /*刪除分區(qū)表一個(gè)分區(qū)的數(shù)據(jù)*/ alter table table_name truncate partition partDemo;?
總結(jié)
以上是生活随笔為你收集整理的oracle表分区实操训练的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 论文的框架和逻辑如何把握?
- 下一篇: app的appPackage、appAc