如何将一个普通的非分区表进行分区5 ALTER TABLE方式

来源:这里教程网 时间:2026-03-03 21:32:28 作者:

如何将一个普通的非分区表进行分区5 ALTER TABLE方式 ## 参考文档: https://docs.oracle.com/en/database/oracle/oracle-database/19/vldbg/evolve-nopartition-table.html#GUID-5FDB7D59-DD05-40E4-8AB4-AF82EA0D0FE5 ## 简介: oracle 12.2之后可以通过ALTER TABLE modify 进行修改(如果能停机还是停机修改,虽然我测试没问题,但是怕出现bug。)   ## 1、创建模拟环境 创建用户 create user ZC identified by ZC; grant dba to ZC; connect ZC/ZC 创建一个表 CREATE TABLE unpar_table ( a NUMBER, y number, name VARCHAR2(100), date_used date); 为表添加主键 alter table unpar_table ADD (CONSTRAINT unpar_table_pk PRIMARY KEY (a,y)); 在表中插入数据 ++ load table with 1,000,000 rows begin for i in 1 .. 1000 loop for j in 1 .. 1000 loop insert into unpar_table values ( i, j, dbms_random.random, sysdate+j ); end loop; end loop; end; / commit; +++++++++++++++++++++++++++++++++++++++++++++++++ 收集统计信息,并查看表的行数 EXEC DBMS_STATS.gather_table_stats('ZC', 'unpar_table', cascade => TRUE); SELECT num_rows FROM user_tables WHERE table_name = 'UNPAR_TABLE'; ## 2、修改为分区表  ALTER TABLE unpar_table MODIFY   PARTITION BY RANGE (date_used)   (PARTITION unpar_table_12 VALUES LESS THAN (TO_DATE('10/05/2015', 'DD/MM/YYYY')), PARTITION unpar_table_15 VALUES LESS THAN (TO_DATE('15/05/2015', 'DD/MM/YYYY')), PARTITION unpar_table_MX VALUES LESS THAN (MAXVALUE)) ONLINE   UPDATE INDEXES;    建议最好不要online操作   ##  3、查询结果 SQL> SELECT partitioned FROM user_tables WHERE table_name = 'UNPAR_TABLE'; PAR --- YES       ## 4、查询alert table online情况下的锁情况   4.1 准备测试数据: 创建一个表 CREATE TABLE unpar_table ( a NUMBER, y number, name VARCHAR2(100), date_used date); 为表添加主键 alter table unpar_table ADD (CONSTRAINT unpar_table_pk PRIMARY KEY (a,y)); 在表中插入数据 ++ load table with 1,000,000 rows begin for i in 1 .. 1000 loop for j in 1 .. 1000 loop insert into unpar_table values ( i, j, dbms_random.random, sysdate+j ); end loop; end loop; end; / commit; +++++++++++++++++++++++++++++++++++++++++++++++++ 收集统计信息,并查看表的行数 EXEC DBMS_STATS.gather_table_stats('ZC', 'unpar_table', cascade => TRUE); SELECT num_rows FROM user_tables WHERE table_name = 'UNPAR_TABLE'; 4.2 进行转换并查询锁情况 会话1 : 进行alert   ALTER TABLE unpar_table MODIFY   PARTITION BY RANGE (date_used)   (PARTITION unpar_table_12 VALUES LESS THAN (TO_DATE('10/05/2015', 'DD/MM/YYYY')), PARTITION unpar_table_15 VALUES LESS THAN (TO_DATE('15/05/2015', 'DD/MM/YYYY')), PARTITION unpar_table_MX VALUES LESS THAN (MAXVALUE)) ONLINE   UPDATE INDEXES; 会话2: 执行插入 insert into unpar_table values(1111005,11002,dbms_random.random,sysdate); commit; insert into unpar_table values(1111006,11003,dbms_random.random,sysdate); commit; insert into unpar_table values(11005557,11004,dbms_random.random,sysdate); commit; 会话可以正常提交,也就是alter 期间可以正常插入数据。 会话3:查询锁和阻塞情况    SID SERIAL# SPID 锁模式 登录用户 登录机器用户名 机器名 终端用户名 被锁对象名 登录数据库时间 1 621 31371 16567 3 ZC oracle zc pts/2 UNPAR_TABLE 2025-01-21 9:05:09 2 621 31371 16567 6 ZC oracle zc pts/2 SYS_JOURNAL_19330107 2025-01-21 9:05:09 3 621 31371 16567 3 ZC oracle zc pts/2 CON$ 2025-01-21 9:05:09 4 621 31371 16567 3 ZC oracle zc pts/2 OBJ$ 2025-01-21 9:05:09 5 621 31371 16567 6 ZC oracle zc pts/2 SYS_RMTAB$$_H19330107 2025-01-21 9:05:09      

相关推荐