oracle11g安装教程
了解如何在Oracle中向现有表添加分区。 Oracle 12c中对分区的新更改。 使用ALTER TABLE…MODIFY命令以3种方式对分区表进行分区。 1)基本离线操作2)在线操作3)修改索引分区的在线操作
如何更改现有表以在Oracle中创建范围分区
当您想查看性能改进,尤其是在DATE列上时,在表上创建分区非常重要。 在本文中,我们将学习如何使用分区更改现有表。
什么是Oracle中的分区:
Oracle分区允许将表和索引划分为更小,更易于管理的单元,从而使数据库管理员能够追求“分而治之”的数据管理方法。 …该表可以进行范围分区,以便每个分区包含一天的数据。
使用范围分区创建分区:
CREATE TABLE table_name
(column_name DATE)
PARTITION BY RANGE (column_name)
(PARTITION partition_name VALUES LESS THAN (value));
例:
CREATE TABLE STUDENT
(
STUDENT_ID NUMBER( 22 , 0 ) NOT NULL,
STUDENT_NAME VARCHAR2( 64 ) NOT NULL,
STUDENT_JOINING_DATE DATE NOT NULL
)
PARTITION BY RANGE
(
STUDENT_JOINING_DATE
)
(
PARTITION JOINING_20190701 VALUES LESS THAN (TO_DATE( '2019-07-01' , 'YYYY-MM-DD' )),
PARTITION JOINING_20200101 VALUES LESS THAN (TO_DATE( '2020-01-01' , 'YYYY-MM-DD' )),
PARTITION JOINING_20200701 VALUES LESS THAN (TO_DATE( '2020-07-01' , 'YYYY-MM-DD' )),
PARTITION JOINING_20210101 VALUES LESS THAN (TO_DATE( '2021-01-01' , 'YYYY-MM-DD' )),
PARTITION JOINING_20210701 VALUES LESS THAN (TO_DATE( '2021-07-01' , 'YYYY-MM-DD' )),
PARTITION JOINING_20220101 VALUES LESS THAN (TO_DATE( '2022-01-01' , 'YYYY-MM-DD' )),
PARTITION JOINING_20220701 VALUES LESS THAN (TO_DATE( '2022-07-01' , 'YYYY-MM-DD' )),
PARTITION JOINING_20230101 VALUES LESS THAN (TO_DATE( '2023-01-01' , 'YYYY-MM-DD' )),
PARTITION JOINING_20230701 VALUES LESS THAN (TO_DATE( '2023-07-01' , 'YYYY-MM-DD' )),
PARTITION JOINING_20240101 VALUES LESS THAN (TO_DATE( '2024-01-01' , 'YYYY-MM-DD' )),
PARTITION JOINING_20240701 VALUES LESS THAN (TO_DATE( '2024-07-01' , 'YYYY-MM-DD' )),
PARTITION JOINING_20250101 VALUES LESS THAN (TO_DATE( '2025-01-01' , 'YYYY-MM-DD' )),
PARTITION JOINING_MAX VALUES LESS THAN (MAXVALUE)
);
现在,此新表已部署到生产环境中,并已投入生产1年。 该表现在有1000万条记录。 现在稍后,我们需要在STUDENT_JOINING_DATE列上添加一个分区。 现在我们将看到如何处理这种情况。
是否可以在现有表上添加分区:
好吧,无论哪种方式,您都必须重新创建表-完全没有办法。 考虑一下-您已有一个充满数据的表。 2月旁边是1月的行,3月旁边是行。 整个表需要重写。
在Oracle数据库中这是不可能的。
我们应该做以下事情。
1)导出表2)创建一个新的具有分区定义的空表3)使用IGNORE = Y导入表
您必须注意以下事项。
在这里您需要重新创建
1)索引2)补助金3)添加约束4)添加触发器5)添加您需要做的一切
oracle 12c版本允许将分区添加到现有表中。
Oracle Database 12c第2版(12.2)中的分区增强功能
在Oracle中将非分区表转换为分区表:
我们将执行以下步骤在oracle中的现有表上创建分区。
1)删除表(如果存在)2)创建表3)在分区列上创建索引4)将10000条记录插入到我们在步骤2中创建的现有表中
创建并填充测试表。 您将需要在每个测试之间重复此步骤。
删除表(如果存在):
DROP TABLE Emp ;
创建表:
CREATE TABLE Emp (
id NUMBER,
name VARCHAR2( 50 ),
join_date DATE,
CONSTRAINT emp_pk PRIMARY KEY (id)
);
创建索引:
CREATE INDEX emp_join_date_idx ON t1(join_date);
插入数据:
在这里,此脚本将10000条记录插入到Emp表中。
INSERT INTO Emp
SELECT level,
'Name for ' || level, || level,
ADD_MONTHS(TO_DATE( '01-JAN-2019' , 'DD-MON-YYYY' ), -TRUNC(DBMS_RANDOM.value( 1 , 4 )- 1 )* 12 )
FROM dual
CONNECT BY level <= 10000 ;
COMMIT;
查看基于年份的数据:
我们可以看到数据分布在三年中。
SELECT join_date, COUNT(*)
FROM Emp
GROUP BY join_date
ORDER BY 1 ;
Output:
join_date COUNT(*)
--------- ----------
01 -JAN- 15 01 -JAN- 15 3340
01 -JAN- 16 01 -JAN- 16 3290
01 17 01 17 01 -JAN- 17 3370
对现有表进行分区:
我们可以使用ALTER TABLE…MODIFY命令将表转换为分区表。 这是此操作的一些基本示例。 添加ONLINE关键字可以使操作在线完成。
这可以通过3种方式完成。
1)基本离线操作2)在线操作3)在线操作,修改索引分区
1)基本离线操作:
ALTER TABLE Emp MODIFY
PARTITION BY RANGE (join_date) (
PARTITION Emp_part_2015 VALUES LESS THAN (TO_DATE( '01-JAN-2016' , 'DD-MON-YYYY' )),
PARTITION Emp_part_2016 VALUES LESS THAN (TO_DATE( '01-JAN-2017' , 'DD-MON-YYYY' )),
PARTITION Emp_part_2017 VALUES LESS THAN (TO_DATE( '01-JAN-2018' , 'DD-MON-YYYY' ))
);
2)在线操作
ALTER TABLE Emp MODIFY
PARTITION BY RANGE (join_date) (
PARTITION Emp_part_2015 VALUES LESS THAN (TO_DATE( '01-JAN-2016' , 'DD-MON-YYYY' )),
PARTITION Emp_part_2016 VALUES LESS THAN (TO_DATE( '01-JAN-2017' , 'DD-MON-YYYY' )),
PARTITION Emp_part_2017 VALUES LESS THAN (TO_DATE( '01-JAN-2018' , 'DD-MON-YYYY' ))
) ONLINE;
3)在线操作,修改索引分区
ALTER TABLE Emp MODIFY
PARTITION BY RANGE (join_date) (
PARTITION Emp_part_2015 VALUES LESS THAN (TO_DATE( '01-JAN-2016' , 'DD-MON-YYYY' )),
PARTITION Emp_part_2016 VALUES LESS THAN (TO_DATE( '01-JAN-2017' , 'DD-MON-YYYY' )),
PARTITION Emp_part_2017 VALUES LESS THAN (TO_DATE( '01-JAN-2018' , 'DD-MON-YYYY' ))
) ONLINE
UPDATE INDEXES
(
Emp_pk GLOBAL ,
Emp_join_date_idx LOCAL
);
翻译自: https://www.javacodegeeks.com/2020/08/adding-partition-to-existing-table-in-oracle.html
oracle11g安装教程