This is one of those “I knew it works this way, why do I keep falling for it?” so hopefully blogging about it will keep my memory fresh π
Starting 11gR2 when you mark an index or an index partition UNUSABLE the segment is dropped (unless you are on 12c and use ONLINE), this is the intended behavior.
SQL> create table t_unusable (n1 number, n2 number);
SQL> create index t_unusable_idx on t_unusable(n1);
SQL> insert into t_unusable values (1,2); -- this is just to materialize the segment
SQL> select index_name, segment_created from user_indexes where index_name = 'T_UNUSABLE_IDX';
INDEX_NAME SEG
------------------------------ ---
T_UNUSABLE_IDX YES
SQL> alter index t_unusable_idx unusable;
SQL> select index_name, segment_created from user_indexes where index_name = 'T_UNUSABLE_IDX';
INDEX_NAME SEG
------------------------------ ---
T_UNUSABLE_IDX NO
SQL> select object_id, data_object_id from user_objects where object_name = 'T_UNUSABLE_IDX';
OBJECT_ID DATA_OBJECT_ID
---------- --------------
70989
(*)
This is a nice way to speed up large data loads since it will reduce REDO generated plus it’s faster to rebuild an index than to maintain it online.
What I keep forgetting is that if you truncate the table (or the partition) the segment is recreated, hence your data load process will end up maintaining the index online π¦
SQL> truncate table t_unusable;
SQL> select index_name, segment_created from user_indexes where index_name = 'T_UNUSABLE_IDX';
INDEX_NAME SEG
------------------------------ ---
T_UNUSABLE_IDX YES
SQL> select object_id, data_object_id from user_objects where object_name = 'T_UNUSABLE_IDX';
OBJECT_ID DATA_OBJECT_ID
---------- --------------
70989 70992
----- begin tree dump
leaf: 0x1024b7b 16927611 (0: nrow: 0 rrow: 0)
----- end tree dump
Conclusion (aka note to self): if you plan to use TRUNCATE + mark indexes UNUSABLE remember to TRUNCATE first and mark UNUSABLE after π
(*) there is no TREEDUMP here since the trace raised ORA-600 [25027]
Pingback: Top 50 Oracle SQL Blogs for 2016 - Complete IT Professional