In previous Releases, To move a table to a different tablespace or segment, we need to take downtime for this activity And after moving the table, we have to rebuild/recreate the indexes.

Now with Oracle 12.2, We can move the table online to a different segment or tablespace, without impacting the DML activities and without making the indexes unusable. It will take care of the Index maintenance activity.

SYNTAX – ALTER TABLE MOVE ONLINE;

Lets test this feature.

SQL> select table_name,tablespace_name from dba_tables where table_name='DBA_TAB';


TABLE_NAME         TABLESPACE_NAME
------------------ ------------------------------
DBA_TAB            USERS

set lines 299
col index_name for a23
SQL> select index_name,status,TABLESPACE_NAME  from dba_indexes where table_name='DBA_TAB';

INDEX_NAME              STATUS   TABLESPACE_NAME
----------------------- -------- ------------------------------
DBA_IDX1                VALID    USERS
DBA_IDX2                VALID    USERS

On session 1( Run the alter table move online command)

SQL> alter table DBA_TAB move tablespace TS_TEST online;

On session 2( Do some DML activity)

SQL>  insert into DBA_TAB select * from DBA_TAB;

Lets see, whether DML is getting blocked or not.

SQL> blocker.sql

   INST_ID BLOCKING_SESSION        SID    SERIAL# SECONDS_IN_WAIT
---------- ---------------- ---------- ---------- ---------------
         1              342        401      64675             168


-- Lets get the sql_text from sql_id

SQL> @csql
Enter value for 1: 342
old   2: (select sql_hash_value from gv$session where sid=&1)
new   2: (select sql_hash_value from gv$session where sid=342)

SQL_TEXT
--------------------------------------------------------------------------------
 insert into DBA_TAB select * from DBA_TAB

SQL> csql
Enter value for 1: 401 ------- >> BLOCKED SESSION
old   2: (select sql_hash_value from gv$session where sid=&1)
new   2: (select sql_hash_value from gv$session where sid=401)

SQL_TEXT
--------------------------------------------------------------------------------
alter table DBA_TAB move tablespace TS_TEST online

We can see the that the alter table statement is blocked by the insert statement, Even though we fired the Insert statement after the alter table move command. It shows the DMLs are not getting impacted due to this alter table move command online. However, the time taken to complete the alter table move online may take more time.

After few seconds, the DML statement completed.

SQL>  insert into DBA_TAB select * from DBA_TAB;

982188 rows created.

SQL> commit;

Commit complete.

Now only that alter table move statement ins running.

I checked the index status:

SQL> select index_name,status,TABLESPACE_NAME,TEMPORARY  from dba_indexes where table_name='DBA_TAB';

INDEX_NAME                                                                           STATUS   TABLESPACE_NAME                T
-------- ------------------------------ 					      -------    --------------
DBA_IDX1                                                                             VALID    USERS                          N
DBA_IDX2                                                                             VALID    USERS                          N
DBA_IDX1_SYS_95234                                                                   VALID    USERS                          N
DBA_IDX2_SYS_95234                                                                   VALID    USERS                          N

Now we are seeing more 2 indexes DBA_IDX1_SYS_95234,DBA_IDX2_SYS_95234 . It seems these indexes were created for the interim purpose during the move online operation.

After 2 min, the alter statement completed.

SQL> alter table DBA_TAB move tablespace TS_TEST online;

Table altered.

Check the index status:

SQL>  select index_name,status,TABLESPACE_NAME  from dba_indexes where table_name='DBA_TAB';

INDEX_NAME              STATUS   TABLESPACE_NAME
----------------------- -------- ------------------------------
DBA_IDX1                VALID    USERS
DBA_IDX2                VALID    USERS

SQL> select table_name,tablespace_name from dba_tables where table_name='DBA_TAB';

TABLE_NAME         TABLESPACE_NAME
------------------ ------------------------------
DBA_TAB            TS_TEST

The table has been moved to the new tablespace. All indexes are also valid, so no need to rebuild or recreate any of the indexes. 🙂

Oracle 12.2 is making our job much easier.