Oracle

帶有 WHERE 子句的 DBMS_REDEFINITION

  • February 24, 2016

我想知道 DBMA_REDEFINITON 包是否允許 WHERE 子句在遷移之前過濾內容。

我有一個分區表,想使用 DBMA_REDEFINITON 將數據和約束複製到另一個表,但是在複製內容時,我不想從原始表中複製特定分區。是否可以使用 WHERE 子句刪除此分區。

問題來自Oracle Tips網站上提供的以下資訊

Online table redefinition: You can drop large numbers of rows from a table by adding a WHERE clause predicate to filter-out unwanted rows when you copy the table.

我的要求來自下面​​的範例,新表是否可以只有分區 Part_2 和 Part3。(使用 WHERE 子句刪除分區 Part_1)

-- Existing Table
CREATE TABLE ORIGINAL
(
 ID                INT NOT NULL PRIMARY KEY,
 TEXT              VARCHAR2(255 CHAR) NOT NULL
)PARTITION BY RANGE
 (
   ID
 )
 (
   PARTITION part_1 VALUES LESS THAN(2),
   PARTITION part_2 VALUES LESS THAN(3),
   PARTITION part_3 VALUES LESS THAN(MAXVALUE)
 )
/
-- some data in the table
insert into ORIGINAL values (1, 'test');

-- some index on the table
create index idx_ORIGINAL on ORIGINAL(TEXT);

--INTERIM table for REDEFINITION (has all partitions right now)
CREATE TABLE ORIGINAL_INTERIM
(
 ID                INT NOT NULL PRIMARY KEY,
 TEXT              VARCHAR2(255 CHAR) NOT NULL
)
PARTITION BY RANGE
 (
   ID
 )
 (
   PARTITION part_1 VALUES LESS THAN(2),
   PARTITION part_2 VALUES LESS THAN(3),
   PARTITION part_3 VALUES LESS THAN(MAXVALUE)
 )
/

-- Start Redefinition
BEGIN
 DBMS_REDEFINITION.START_REDEF_TABLE('TSPACE1','ORIGINAL','ORIGINAL_INTERIM');
END;
/


-- Copy objects
DECLARE
 num_errors PLS_INTEGER;
BEGIN
 DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS ('TSPACE1','ORIGINAL','ORIGINAL_INTERIM',
   DBMS_REDEFINITION.CONS_ORIG_PARAMS, TRUE, TRUE, TRUE, TRUE, num_errors);
END;
/


-- Sync
BEGIN
 DBMS_REDEFINITION.SYNC_INTERIM_TABLE ('TSPACE1','ORIGINAL','ORIGINAL_INTERIM');
END;
/

-- finish
BEGIN
 DBMS_REDEFINITION.FINISH_REDEF_TABLE ('TSPACE1','ORIGINAL','ORIGINAL_INTERIM');
END;
/

-- Drop interim table
drop table ORIGINAL_INTERIM cascade constraints purge;

您可以使用過程part_name參數DBMS_REDEFINITION.START_REDEF_TABLE。這是線上表重新定義的完整範例。Oracle Docs 中的線上表重定義範例

將分區移動到另一個表空間的方法

引用自:https://dba.stackexchange.com/questions/130315