Partitioning “SCOTT”.”
CREDIT_CARD” Heap Table
Given
that this table is frequently written to, it is envisaged that the Partitioning
will be done with Oracle 11g redefinition.
A
rough first plan is detailed below about how I think we should prepare and
carry out this process.
Create new Partition Tablespace to hold Interim Table
- Ensure that new Tablespace
has enough space for interim table and indexes
- Extend datafiles or
add new datafiles if required
- Double check that
space is free and available
Determine and retain Object Status
- Table row count
- Run query to get total count per month
Select
to_date(call_date,'DD-MON-YYYY'), COUNT(*) from SCOTT.CREDIT_CARD group by
to_date(call_date,'DD-MON-YYYY') order
by to_date(call_date,'DD-MON-YYYY');
- Group by month as use as a check later on
- Table column listing
- Table sum bytes
- MB
- Table Primary Keys
- Names
- Columns
- Order
- Table Indexes
- Names
- Status
- Columns
- Order
- Creation date
- Invalid Object check
- No Invalid Objects
in schema
- Table constraints
- Names
- Types of
constraints
- Columns
- Table Statistics
- Gather statistics
- AWR report
- Take AWR Report prior to start
Query Timings
- Obtain timings from queries
- Full table scan, no
where clause
- Select within 1
month only
- April 2013 (start of inserts)
- August 2012 (average month increase)
- October 2012 (significant jump)
- Select crossing 4
months above
- Select with columns
other than datelogged
Backup table and indexes
- Export Table and
Indexes, constraints and statistics
- EXPDP
Start Partitioning
- Confirm table can be redefined using Primary Key
BEGIN
DBMS_REDEFINITION.CAN_REDEF_TABLE('SCOTT','CREDIT_CARD',
DBMS_REDEFINITION.CONS_USE_PK);
END;
- Create New Interim Interval composite Partition Table (Range+Hash)
CREATE TABLE "SCOTT"."CREDIT_CARD_INTERIM"
( "USERNAME" VARCHAR2(256) NOT NULL ENABLE,
"CALL_DATE" TIMESTAMP (6) NOT NULL ENABLE,
"METHOD_NAME" VARCHAR2(256) NOT NULL ENABLE,
"PARAMETERS" VARCHAR2(4000),
"DURATION" NUMBER(*,0) NOT NULL ENABLE,
"STATUS" NUMBER(*,0),
"BLS_PROPID" NUMBER,
"STATUS_MSG" VARCHAR2(4000),
"RESPONSE_VALUES" VARCHAR2(4000),
"REMOTE_ADDRESS" VARCHAR2(100),
"ID" NUMBER NOT NULL ENABLE,
"TRANSACTION_ID" NUMBER,
CONSTRAINT "CREDIT_CARD_PRIMARY_KEY" PRIMARY KEY ("ID") USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)TABLESPACE "DEV_INDEX" ENABLE)
PARTITION BY RANGE(CALL_DATE)
INTERVAL(NUMTOYMINTERVAL(1, 'MONTH')) STORE IN (FLOW_1)
subpartition by hash(ID)
subpartition template(
subpartition clock_sp1,
subpartition clock_sp2,
subpartition clock_sp3,
subpartition clock_sp4,
subpartition clock_sp5,
subpartition clock_sp6,
subpartition clock_sp7,
subpartition clock_sp8)
(PARTITION "CREDIT_CARD_CALL_P1" VALUES LESS THAN (TO_DATE(' 2010-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) SEGMENT CREATION DEFERRED PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING) ENABLE ROW MOVEMENT;
- Start redefinition – using Primary Key
SQL>
exec
DBMS_REDEFINITION.START_REDEF_TABLE (uname =>'SCOTT',orig_table
=>'CREDIT_CARD',int_table => 'CREDIT_CARD_INTERIM',col_mapping => '',
options_flag =>
DBMS_REDEFINITION.CONS_USE_PK);
- Perform
a count to check status
SQL>select count(1) from SCOTT.CREDIT_CARD_INTRIM;
COUNT(1)
----------
1000
SQL>select count(1) from SCOTT.CREDIT_CARD;
COUNT(1)
----------
1030
Note: There will likely be continuous inserts into the original table
so there might be a few more records in original table than interim table. This
Sync can be done frequently without any effect.Sync new table on regular basis till cut off time
BEGIN
DBMS_REDEFINITION.SYNC_INTERIM_TABLE(
uname => SCOTT,
orig_table => 'CREDIT_CARD',
int_table => 'CREDIT_CARD_INTRIM'
);
END;
/
- Copy Dependent Objects
DECLARE
num_errors PLS_INTEGER;
BEGIN
DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS(
uname => SCOTT,
orig_table => 'CREDIT_CARD',
int_table => 'CREDIT_CARD_INTRIM',
copy_indexes => DBMS_REDEFINITION.CONS_ORIG_PARAMS,
copy_triggers => TRUE,
copy_constraints => TRUE,
copy_privileges => TRUE,
ignore_errors => TRUE,
num_errors => num_errors);
END;
/
- Confirm that Interim table is Partitioned before completing
SQL>select table_name, partitioned from user_tables where table_name in ('CREDIT_CARD',' CREDIT_CARD_INTRIM’);
TABLE_NAME PAR
------------------------------ ---
CREDIT_CARD NO
CRDET_CARD_INTRIM YES
- Run same query as before but against new table
Select
to_date(call_date,'DD-MON-YYYY'), COUNT(*) from SCOTT.CREDIT_CARD group by
to_date(call_date,'DD-MON-YYYY') order
by to_date(call_date,'DD-MON-YYYY');
Check monthly counts match original query.
- Complete the
redefinition( Transaction may interrupt here due to exclusive put on table while ending the redefinition, better to
get outage for few minutes)
BEGIN
DBMS_REDEFINITION.FINISH_REDEF_TABLE(SCOTT, ' CREDIT_CARD ', ' CREDIT_CARD_INTRIM’);
END;
/
- Confirm that original table is now Partitioned and Interim is not
SQL>select table_name, partitioned from user_tables where table_name in ('CREDIT_CARD',' CREDIT_CARD_INTRIM’);
TABLE_NAME PAR
------------------------------ ---
CREDIT_CARD YES
CREDIT_CARD_INTRIM NO
- Now drop the
interim table
Drop table CREDIT_CARD_INTRIM;
No comments:
Post a Comment