在 Oracle PL/SQL 中使用 ONLINE 将非分区 table 转换为分区 table
Convert Non-partition table to partitioned table using ONLINE in Oracle PL/SQL
我知道我们无法将现有的非分区 table 转换为分区 table 但以下来自 Oracle 的 link 建议借助 "ONLINE" 关键字我们可以做到。
CREATE TABLE my_tab ( a NUMBER(38,0), b NUMBER(38,0));
ALTER TABLE MY_TAB MODIFY PARTITION BY RANGE (a) INTERVAL (1000) (
PARTITION p1 VALUES LESS THAN (1000)) ONLINE;
但它对我不起作用,抛出错误 "Invalid Partition Name"。
我不想使用 dbms_redefinition
。
如果您使用的是 Oracle 12c Release 2
,您可以使用单个 ALTER
将非分区 table 转换为分区:
CREATE TABLE my_tab ( a NUMBER(38,0), b NUMBER(38,0));
ALTER TABLE MY_TAB MODIFY PARTITION BY RANGE (a) INTERVAL (1000) (
PARTITION p1 VALUES LESS THAN (1000)) ONLINE;
在 Oracle Database 12c Release 1 (12.1.0.2.0)
且不使用 dbms_redefinition
时,您的选择可能仅限于创建与原始 table 具有相同结构的新分区 table 并复制数据、创建索引、约束等
CREATE TABLE my_tab_part -- new partitioned table
PARTITION BY RANGE (a)
INTERVAL ( 1000 )
(PARTITION p1 VALUES LESS THAN (1000))
AS
SELECT * FROM my_tab;
我知道我们无法将现有的非分区 table 转换为分区 table 但以下来自 Oracle 的 link 建议借助 "ONLINE" 关键字我们可以做到。
CREATE TABLE my_tab ( a NUMBER(38,0), b NUMBER(38,0));
ALTER TABLE MY_TAB MODIFY PARTITION BY RANGE (a) INTERVAL (1000) (
PARTITION p1 VALUES LESS THAN (1000)) ONLINE;
但它对我不起作用,抛出错误 "Invalid Partition Name"。
我不想使用 dbms_redefinition
。
如果您使用的是 Oracle 12c Release 2
,您可以使用单个 ALTER
将非分区 table 转换为分区:
CREATE TABLE my_tab ( a NUMBER(38,0), b NUMBER(38,0));
ALTER TABLE MY_TAB MODIFY PARTITION BY RANGE (a) INTERVAL (1000) (
PARTITION p1 VALUES LESS THAN (1000)) ONLINE;
在 Oracle Database 12c Release 1 (12.1.0.2.0)
且不使用 dbms_redefinition
时,您的选择可能仅限于创建与原始 table 具有相同结构的新分区 table 并复制数据、创建索引、约束等
CREATE TABLE my_tab_part -- new partitioned table
PARTITION BY RANGE (a)
INTERVAL ( 1000 )
(PARTITION p1 VALUES LESS THAN (1000))
AS
SELECT * FROM my_tab;