隨着業務數據量的增大,單張表的數據量會越來越大,對錶的操作效率會越來越低,因此有必要對數據庫的表進行分區處理.這裏介紹其一,還有另一種在線重定義表分區也是可以的(ORACLE9之後添加的新功能)
思路:
1.查看錶大小(確定是否有必要進行分區)
2.對CUS_SUMMARY的表結構和數據進行備份CUS_SUMMARY1和建立分區表之後將數據導入到CUS_SUMMARY2中
3.刪除CUS_SUMMARY,將CUS_SUMMARY2重命名爲CUS_SUMMARY
首先看下數據量和所佔用的內存大小,查詢後選擇分區
--1
select sum(bytes)/(1024*1024) as "size(M)" from user_segments
where segment_name=upper('CUS_SUMMARY');
--2
select count(*) from CUS_SUMMARY
1.創建複製一份原有的表和數據到新的表中,原建表語句
-- Create table
create table CUS_SUMMARY
(
pk VARCHAR2(36) default "PBP"."ISEQ$$_99928".nextval not null,
pktt VARCHAR2(4),
term VARCHAR2(8),
termsub VARCHAR2(8),
pkorg VARCHAR2(12),
orgname VARCHAR2(30),
pkcus VARCHAR2(36),
cusname VARCHAR2(100),
pkkv VARCHAR2(36),
pkog VARCHAR2(12),
pkkv_source VARCHAR2(36),
value NUMBER(20,6),
pksub VARCHAR2(40),
if_import CHAR(1),
remark VARCHAR2(300),
rcreationtime DATE,
rcreator VARCHAR2(36),
rcreationversion VARCHAR2(20)
)
tablespace TSPBP
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
next 1M
minextents 1
maxextents unlimited
);
-- Add comments to the table
comment on table CUS_SUMMARY
is '客戶彙總表(用BAS_KEYWORD_VARIABLE變量)';
-- Add comments to the columns
comment on column CUS_SUMMARY.pk
is '客戶彙總主鍵';
comment on column CUS_SUMMARY.pktt
is '時期類型主鍵(3月6年06年初bas_term_type)';
comment on column CUS_SUMMARY.term
is '時期(例六月201406,二季20142,年2014,上半年20141,當前9不填)';
comment on column CUS_SUMMARY.termsub
is '時期-輔助字段(不定期存結束日期)';
comment on column CUS_SUMMARY.pkorg
is '機構主鍵';
comment on column CUS_SUMMARY.orgname
is '機構名稱';
comment on column CUS_SUMMARY.pkcus
is '客戶主鍵';
comment on column CUS_SUMMARY.cusname
is '客戶名稱(姓名/企業中文名稱)';
comment on column CUS_SUMMARY.pkkv
is '關鍵字變量主鍵';
comment on column CUS_SUMMARY.pkog
is '網格主鍵';
comment on column CUS_SUMMARY.pkkv_source
is '關鍵字變量主鍵_源';
comment on column CUS_SUMMARY.value
is '關鍵字變量值';
comment on column CUS_SUMMARY.pksub
is '輔助主鍵-1:相關表中的主鍵值,方便特殊查詢2:null代表總數';
comment on column CUS_SUMMARY.if_import
is '是否導入';
comment on column CUS_SUMMARY.remark
is '備註';
comment on column CUS_SUMMARY.rcreationtime
is '記錄創建時間';
comment on column CUS_SUMMARY.rcreator
is '記錄創建人主鍵';
comment on column CUS_SUMMARY.rcreationversion
is '記錄創建版本';
-- Create/Recreate indexes
create unique index INDEX_62 on CUS_SUMMARY (PKTT, PKORG, PKKV, PKSUB, TERM DESC, PKCUS)
tablespace TSPBP
pctfree 10
initrans 2
maxtrans 255
storage
(
initial 64K
next 1M
minextents 1
maxextents unlimited
);
-- Create/Recreate primary, unique and foreign key constraints
alter table CUS_SUMMARY
add constraint PK_CUS_SUMMARY primary key (PK)
using index
tablespace TSPBP
pctfree 10
initrans 2
maxtrans 255
storage
(
initial 64K
next 1M
minextents 1
maxextents unlimited
);
創建CUS_SUMMARY1,備份數據
insert into CUS_SUMMARY1 select * from CUS_SUMMARY;
創建分區表CUS_SUMMARY2,添加分區語句,這裏最好先不要加索引,因爲添加索引之後,從舊錶往新表導入數據會很慢,
-- Create table
partition by range(term)
interval (1)
store in (users, system)
(
partition sp1 values less than (201811)
)
2.Oracle的普通表沒有辦法通過修改屬性的方式直接轉化爲分區表,必須通過重建的方式進行轉變,添加分區語句,根據需要添加分區(不需要添加MAXVALUE分區,不然之後添加分區會很麻煩)
3.刪除原CUS_SUMMARY表,將CUS_SUMMARY2重命名爲CUS_SUMMARY,可能數據量比較大,所以我這裏報錯了,所以大家可以刪除CUS_SUMMARY,重新新建帶分區的CUS_SUMMARY,將CUS_SUMMARY1或者CUS_SUMMARY2數據導入
ALTER TABLE CUS_SUMMARY2 RENAME TO CUS_SUMMARY;
拓展
alter table CUS_SUMMARY2 add partition CUS_201905 values less than ('201906');
```sql
---彩蛋:測試建立表分區
create table emp
(
EMPNO NUMBER(4) not null,
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
MGR NUMBER(4),
HIREDATE DATE,
SAL number,
COMM NUMBER(7,2),
DEPTNO NUMBER(2)
)
partition by range(sal)
interval (1)
store in (users, system)
(
partition sp1 values less than (201701)
);
續集
[數據量大到原始表空間不足解決辦法](https://blog.csdn.net/weixin_43495390/article/details/105215123)