达梦8普通表改造为分区表

(1)查看原表DDL

SQL> set linesize 200 pages 200 long 9999 lineshow off
SQL> select dbms_metadata.get_ddl('TABLE','EMP','HAHA') from dual;

CREATE TABLE "HAHA"."EMP"
(
"ID" NUMBER NOT NULL,
"NAME" VARCHAR(20),
"AGE" NUMBER,
"DEPTNO" NUMBER,
"SALARY" NUMBER,
"PHONE" NUMBER,
"HIRE_DATE" DATETIME(6) DEFAULT SYSDATE,
"SEX" BIT,
CONSTRAINT "PK_EMP_ID" CLUSTER PRIMARY KEY("ID"),
CONSTRAINT "FK_EMP_DEPTNO" FOREIGN KEY("DEPTNO") REFERENCES "HAHA"."DEPT"("DEPTNO"),
CHECK("AGE" > 18)) STORAGE(ON "HAHA", CLUSTERBTR) ;

已用时间: 2.874(毫秒). 执行号:2481539.

(2)检查原表相关信息

检查原表的索引

SQL> select index_name,table_name,degree,status,partitioned from user_indexes t where table_name='EMP';

行号     INDEX_NAME       TABLE_NAME DEGREE STATUS PARTITIONED
---------- ---------------- ---------- ------ ------ -----------
1          INDEX33556206    EMP        NULL   VALID  NO
2          INDEX33556197    EMP        NULL   VALID  NO

已用时间: 253.690(毫秒). 执行号:2481855.

检查原表约束

SQL> select TABLE_NAME,CONSTRAINT_NAME,CONSTRAINT_TYPE,INDEX_NAME,R_CONSTRAINT_NAME from dba_constraints where OWNER='HAHA' and TABLE_NAME='EMP';

行号     TABLE_NAME CONSTRAINT_NAME CONSTRAINT_TYPE INDEX_NAME    R_CONSTRAINT_NAME
---------- ---------- --------------- --------------- ------------- -----------------
1          EMP        CONS134219061   C               NULL          NULL
2          EMP        PK_EMP_ID       P               INDEX33556197 NULL
3          EMP        FK_EMP_DEPTNO   R               INDEX33556204 PK_DEPT_NO

已用时间: 575.028(毫秒). 执行号:2481955.

检查原表涉及的其他对象

SQL> select * from user_dependencies t where t.referenced_name = 'EMP';

行号     OWNER NAME       TYPE    REFERENCED_OWNER REFERENCED_NAME REFERENCED_TYPE REFERENCED_LINK_NAME SCHEMAID    DEPENDENCY_TYPE
---------- ----- ---------- ------- ---------------- --------------- --------------- -------------------- ----------- ---------------
1          HAHA  V_EMP      VIEW    HAHA             EMP             TABLE           NULL                 150995949   HARD
2          HAHA  TR_ROW_EMP TRIGGER HAHA             EMP             TABLE           NULL                 150995949   HARD

已用时间: 109.897(毫秒). 执行号:2481956.

发现存在 基于EMP表创建的视图和触发器

查看视图DDL

SQL> select dbms_metadata.get_ddl('VIEW','V_EMP','HAHA') from dual;

DBMS_METADATA.GET_DDL('VIEW','V_EMP','HAHA')                                                                                   
----------------------------------------------------------------------------------------------------
create or replace view v_emp as 
select e.id,e.name,d.dept_name,e.salary,e.hire_date from emp e,dept d
where e.deptno=d.deptno;

已用时间: 2.061(毫秒). 执行号:2481958.

查看触发器DDL

SQL> select dbms_metadata.get_ddl('TRIGGER','TR_ROW_EMP','HAHA') from dual;

DBMS_METADATA.GET_DDL('TRIGGER','TR_ROW_EMP','HAHA')                                                                                                                                        
---------------------------------------------------------------------------------------------------
CREATE  TRIGGER        "TR_ROW_EMP"
 BEFORE  UPDATE 
 ON        "EMP" 
 referencing OLD ROW AS "OLD" NEW ROW AS "NEW"

 for each row

begin
        dbms_output.put_line('run row tr');
end;

已用时间: 2.316(毫秒). 执行号:2481959.

检查原表的外键依赖

SQL> select t1.table_name, 
       t2.table_name as "TABLE_NAME(R)", 
       t1.constraint_name, 
       t1.r_constraint_name as "CONSTRAINT_NAME(R)",
       a1.column_name, 
       a2.column_name as "COLUMN_NAME(R)"
from user_constraints t1, user_constraints t2, user_cons_columns a1, user_cons_columns a2
where t1.table_name='EMP' and
      t1.r_constraint_name = t2.constraint_name and 
      t1.constraint_name = a1.constraint_name and 
      t1.r_constraint_name = a2.constraint_name;

TABLE_NAME TABLE_NAME(R) CONSTRAINT_NAME CONSTRAINT_NAME(R) COLUMN_NAME COLUMN_NAME(R)
---------- ------------- --------------- ------------------ ----------- --------------
EMP        DEPT          FK_EMP_DEPTNO   PK_DEPT_NO         DEPTNO      DEPTNO

已用时间: 509.415(毫秒). 执行号:2481962.

可见EMP表存在DEPTNO字段的外键依赖于DEPT表

查看表数据量

SQL> select segment_name,sum(bytes)/1024/1024 from dba_segments where segment_name='EMP' and owner='HAHA' group by segment_name;

SEGMENT_NAME SUM(BYTES)/1024/1024
------------ --------------------
EMP          95

已用时间: 00:00:02.597. 执行号:2481963.

SQL> select count(*) from emp;

COUNT(*)            
--------------------
1000000

emp表实际数据量为95MB,100w条数据

检查表空间使用情况,查看资源是否充足

SQL> select file_name,tablespace_name,bytes/1024/1024,maxbytes/1024/1024 from dba_data_files;

FILE_NAME                       TABLESPACE_NAME BYTES/1024/1024      MAXBYTES/1024/1024
------------------------------- --------------- -------------------- ------------------
/dm/dmdbms/dmdb/DMDB/SYSTEM.DBF SYSTEM          27                   16777215
/dm/dmdbms/dmdb/DMDB/DMHS.DBF   DMHS            1024                 16777215
/dm/dmdbms/dmdb/DMDB/SYSAWR.DBF SYSAUX          1015                 10240
/dm/dmdbms/dmdb/DMDB/HAHA.DBF   HAHA            252                  30720
/dm/dmdbms/dmdb/DMDB/MAIN.DBF   MAIN            748                  16777215
/dm/dmdbms/dmdb/DMDB/TEMP.DBF   TEMP            136                  16777215
/dm/dmdbms/dmdb/DMDB/ROLL.DBF   ROLL            128                  16777215

7 rows got

已用时间: 195.349(毫秒). 执行号:2481964.

(3)导出原表数据

cd /dm/dmdbms/bin
./dexp haha/haha12345 directory=/dm/dmdbms/dmdb file=emp.dmp log=exp_emp.log tables=emp

(4)重命名原表

SQL> alter table emp rename to emp_old;
操作已执行

(5)创建分区表:根据emp表的字段,可以通过hire_date字段按月进行水平分区改造

create table emp
(id number,
name varchar(20),
age number,
deptno number,
salary number,
phone number,
hire_date datetime,
sex bit
)
partition by range (hire_date)
(
partition hd_1 values less than (to_date('2020-01-01','yyyy-mm-dd')),
partition hd_2 values less than (to_date('2020-02-01','yyyy-mm-dd')),
partition hd_3 values less than (to_date('2020-03-01','yyyy-mm-dd')),
partition hd_4 values less than (to_date('2020-04-01','yyyy-mm-dd')),
partition hd_5 values less than (to_date('2020-05-01','yyyy-mm-dd')),
partition hd_6 values less than (to_date('2020-06-01','yyyy-mm-dd')),
partition hd_7 values less than (to_date('2020-07-01','yyyy-mm-dd')),
partition hd_8 values less than (to_date('2020-08-01','yyyy-mm-dd')),
partition hd_9 values less than (to_date('2020-09-01','yyyy-mm-dd')),
partition hd_10 values less than (to_date('2020-10-01','yyyy-mm-dd')),
partition hd_11 values less than (to_date('2020-11-01','yyyy-mm-dd')),
partition hd_12 values less than (to_date('2020-12-01','yyyy-mm-dd')),
partition hd_13 values equ or less than (to_date('2021-01-01','yyyy-mm-dd')),
partition hd_14 values equ or less than (maxvalue)
);

创建约束及唯一性本地索引,局部唯一索引必须包含全部分区列

SQL> create unique index IDX_EMP_P_ID on EMP (id,hire_date);
操作已执行
已用时间: 324.634(毫秒). 执行号:2481970.
SQL> alter table EMP add primary key (id,hire_date);
操作已执行
已用时间: 275.109(毫秒). 执行号:2481971.
SQL> alter table emp add constraint FK_EMP_NO foreign key (deptno) references dept (deptno);
操作已执行
已用时间: 282.824(毫秒). 执行号:2481972.
SQL> alter table emp add constraint CK_EMP_AGE check (age>18);
操作已执行
已用时间: 914.340(毫秒). 执行号:2482013.

查看分区表信息

SQL> select table_name,partitioning_type ,partition_count from all_part_tables t where table_name='EMP';

TABLE_NAME PARTITIONING_TYPE PARTITION_COUNT     
---------- ----------------- --------------------
EMP        RANGE             14

已用时间: 3.829(毫秒). 执行号:2481973.

SQL> select table_name,partition_name,high_value from  all_tab_partitions where table_name='EMP' order by 3;

TABLE_NAME PARTITION_NAME HIGH_VALUE                   
---------- -------------- -----------------------------
EMP        HD_1           DATETIME'2020-01-01 00:00:00'
EMP        HD_2           DATETIME'2020-02-01 00:00:00'
EMP        HD_3           DATETIME'2020-03-01 00:00:00'
EMP        HD_4           DATETIME'2020-04-01 00:00:00'
EMP        HD_5           DATETIME'2020-05-01 00:00:00'
EMP        HD_6           DATETIME'2020-06-01 00:00:00'
EMP        HD_7           DATETIME'2020-07-01 00:00:00'
EMP        HD_8           DATETIME'2020-08-01 00:00:00'
EMP        HD_9           DATETIME'2020-09-01 00:00:00'
EMP        HD_10          DATETIME'2020-10-01 00:00:00'
EMP        HD_11          DATETIME'2020-11-01 00:00:00'
EMP        HD_12          DATETIME'2020-12-01 00:00:00'
EMP        HD_13          DATETIME'2021-01-01 00:00:00'
EMP        HD_14          MAXVALUE

14 rows got

已用时间: 22.369(毫秒). 执行号:2481975.

(6)插入原表数据

SQL> insert into emp select * from emp_old;
影响行数 1000000

已用时间: 00:01:15.679. 执行号:2481976.
SQL> commit;
操作已执行

(7)重建依赖对象

删除并重建触发器

SQL> drop trigger TR_ROW_EMP;
操作已执行

SQL> create or replace trigger TR_ROW_EMP
before update 
on EMP
for each row
begin
     dbms_output.put_line('run row tr');
end;
/
操作已执行

重建视图

SQL> create or replace view v_emp as 
select e.id,e.name,d.dept_name,e.salary,e.hire_date from emp e,dept d
where e.deptno=d.deptno;2   3   
操作已执行
已用时间: 91.774(毫秒). 执行号:2482009.

再次检查依赖关系

SQL> select * from user_dependencies t where t.referenced_name = 'EMP';

OWNER NAME       TYPE    REFERENCED_OWNER REFERENCED_NAME REFERENCED_TYPE REFERENCED_LINK_NAME SCHEMAID    DEPENDENCY_TYPE
----- ---------- ------- ---------------- --------------- --------------- -------------------- ----------- ---------------
HAHA  TR_ROW_EMP TRIGGER HAHA             EMP             TABLE           NULL                 150995949   HARD
HAHA  V_EMP      VIEW    HAHA             EMP             TABLE           NULL                 150995949   HARD

已用时间: 2.033(毫秒). 执行号:2482010.
SQL> select t1.table_name, 
       t2.table_name as "TABLE_NAME(R)", 
       t1.constraint_name, 
       t1.r_constraint_name as "CONSTRAINT_NAME(R)",
       a1.column_name, 
       a2.column_name as "COLUMN_NAME(R)"
from user_constraints t1, user_constraints t2, user_cons_columns a1, user_cons_columns a2
where t1.table_name='EMP' and
      t1.r_constraint_name = t2.constraint_name and 
      t1.constraint_name = a1.constraint_name and 
      t1.r_constraint_name = a2.constraint_name;

TABLE_NAME TABLE_NAME(R) CONSTRAINT_NAME CONSTRAINT_NAME(R) COLUMN_NAME COLUMN_NAME(R)
---------- ------------- --------------- ------------------ ----------- --------------
EMP        DEPT          FK_EMP_NO       PK_DEPT_NO         DEPTNO      DEPTNO

已用时间: 28.474(毫秒). 执行号:2482006.

(8)根据实际情况决定是否彻底drop掉emp_old表,释放空间。

SQL> drop table emp_old;   
操作已执行
已用时间: 00:00:01.228. 执行号:2481998.
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值