“This is the 14th day of my participation in the Gwen Challenge in November. Check out the details: The Last Gwen Challenge in 2021.”
When a non-partitioned table is converted using the online redefinition function, the intermediate table needs to be indexed, constrained, and other dependencies to rebuild. Oracle provides two methods:
Reference for this article: oracle-base.com/articles/mi…
A, COPY_TABLE_DEPENDENTS
Procedure: DBMS_REDEFINITION. Copy_table_dependents Procedure: DBMS_REDEFINITION.
SET SERVEROUTPUT ON
DECLARE
l_errors NUMBER;
BEGIN
DBMS_REDEFINITION.copy_table_dependents(
uname => USER,
orig_table => 'BIG_TABLE',
int_table => 'BIG_TABLE2',
copy_indexes => DBMS_REDEFINITION.cons_orig_params,
copy_triggers => TRUE,
copy_constraints => TRUE,
copy_privileges => TRUE,
ignore_errors => FALSE,
num_errors => l_errors,
copy_statistics => FALSE,
copy_mvlog => FALSE);
DBMS_OUTPUT.put_line('Errors=' || l_errors);
END;
/
Copy the code
Usage may refer to the official documentation: docs.oracle.com/en/database…
Table 134-7 COPY_TABLE_DEPENDENTS Procedure Parameters
DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS(
uname IN VARCHAR2,
orig_table IN VARCHAR2,
int_table IN VARCHAR2,
copy_indexes IN PLS_INTEGER := 1,
copy_triggers IN BOOLEAN := TRUE,
copy_constraints IN BOOLEAN := TRUE,
copy_privileges IN BOOLEAN := TRUE,
ignore_errors IN BOOLEAN := FALSE,
num_errors OUT PLS_INTEGER,
copy_statistics IN BOOLEAN := FALSE,
copy_mvlog IN BOOLEAN := FALSE);
Copy the code
Advantages and disadvantages of this approach:
Advantages: Depending on the parameters you pass in, you can select dependencies to copy, indexes, triggers, constraints, permissions, and statistics. After dbMS_redefinition. Finish_redef_table is redefined, these dependencies are automatically switched to the partition table without manual rename operation.
Disadvantages: An index copied in this mode retains the index type of a non-partitioned table and is still a GLOBAL index. It is not automatically converted to a LOCAL index based on partitions.
Notes: If you do not want to set the index as a LOCAL index, you can use the above method to replicate the index.
2. Create a vm manually
You can manually create an index by specifying the LOCAL index. However, you need to manually rename the dbMS_redefinition. Finish_redef_table.
-- Add new keys, FKs and triggers.
ALTER TABLE big_table2 ADD (
CONSTRAINT big_table_pk2 PRIMARY KEY (id)
);
CREATE INDEX bita_created_date_i2 ON big_table2(created_date) LOCAL;
CREATE INDEX bita_look_fk_i2 ON big_table2(lookup_id) LOCAL;
ALTER TABLE big_table2 ADD (
CONSTRAINT bita_look_fk2
FOREIGN KEY (lookup_id)
REFERENCES lookup(id)
);
-- Gather statistics on the new table.
EXEC DBMS_STATS.gather_table_stats(USER.'BIG_TABLE2', cascade => TRUE);
-- Remove original table which now has the name of the interim table.
DROP TABLE big_table2;
-- Rename all the constraints and indexes to match the original names.
ALTER TABLE big_table RENAME CONSTRAINT big_table_pk2 TO big_table_pk;
ALTER TABLE big_table RENAME CONSTRAINT bita_look_fk2 TO bita_look_fk;
ALTER INDEX big_table_pk2 RENAME TO big_table_pk;
ALTER INDEX bita_look_fk_i2 RENAME TO bita_look_fk_i;
ALTER INDEX bita_created_date_i2 RENAME TO bita_created_date_i;
Copy the code
Advantages: Dependencies such as indexes can be created in an appropriate manner according to user requirements.
Disadvantages: because is the user to create and switch, so need to have a certain basis, can not miss any dependence, need to consider completely.
COPY_TABLE_DEPENDENTS + Create index manually
You can also use combinations to copy other dependencies with COPY_TABLE_DEPENDENTS and create indexes manually.
-- Exclude index
SET SERVEROUTPUT ON
DECLARE
l_errors NUMBER;
BEGIN
DBMS_REDEFINITION.copy_table_dependents(
uname => USER,
orig_table => 'BIG_TABLE',
int_table => 'BIG_TABLE2',
copy_indexes => 0,
copy_triggers => TRUE,
copy_constraints => TRUE,
copy_privileges => TRUE,
ignore_errors => FALSE,
num_errors => l_errors,
copy_statistics => FALSE,
copy_mvlog => FALSE);
DBMS_OUTPUT.put_line('Errors=' || l_errors);
END;
/
Create index LOCAL (primary key index LOCAL)
CREATE INDEX bita_created_date_i2 ON big_table2(created_date) tablespace USERS LOCAL;
CREATE INDEX bita_look_fk_i2 ON big_table2(lookup_id) tablespace USERS LOCAL;
After the redefinition is complete, rename the index name
-- Rename all the constraints and indexes to match the original names.
ALTER INDEX bita_look_fk_i2 RENAME TO bita_look_fk_i;
ALTER INDEX bita_created_date_i2 RENAME TO bita_created_date_i;
Copy the code
Advantages: Combining the above two methods, this method only needs to pay attention to whether the index is missing, and does not need to pay attention to dependencies such as triggers, permissions, and constraints.