When you "add" a partition to a hash partitioned table, you are in reality, splitting one of the existing partitions. For example, here's a table with 5 partitions
SQL> select DBMS_ROWID.ROWID_OBJECT(rowid) ptn,
2 count(*)
3 from T
4 group by DBMS_ROWID.ROWID_OBJECT(rowid);
PTN COUNT(*)
---------- ----------
72174 12342
72172 25209
72171 24955
72173 24890
72170 12603
5 rows selected.
You can see the imbalance. One I add a partition, one of them gets split
SQL> alter table T add partition;
Table altered.
SQL> select dbms_rowid.ROWID_OBJECT(rowid) ptn,
2 count(*)
3 from T
4 group by dbms_rowid.ROWID_OBJECT(rowid);
PTN COUNT(*)
---------- ----------
73515 25209
73516 24890
73517 12342
73519 12381
73518 12574
73513 12603
This is a good thing, because we didnt need to reshuffle the entire table, but still, that's still a lot of rows to move.
Performance options:
1) drop indexes first, but that means an outage
2) use dbms_redefinition. The overall process will probably take longer, but the application remains available during this time.
The other question to ask is - what benefit are you getting from hash partitioing your table ?