TRUNCATE setzt INDEX Status von UNUSABLE auf USABLE – Oracle 11R2
Nach einem TRUNCATE auf einer Tabelle werden zuvor auf UNUSABLE gesetzte INDEXE / INDIZES automatisch auf USABLE gesetzt.
Diese Verhalten ist mir im Rahmen der Vorbereitung einer Datenmigration aufgefallen, da mein DIRECT LOAD in die Tabelle nicht mehr funktionierte.
Warum ORACLE sich an dieser Stelle so verhält, kann ich nicht nachvollziehen.
Wichtig ist also, dass nach dem TRUNCATE alle INDEXE / INDIZES mittel Befehl – ALTER INDEX xyz UNUSABLE – erneut auf UNUSABLE gesetzt werden müssen.
SQL-SCRIPT UNUSABLE TRUNCATE USABLE INDEX
Dieses kleine Beispiel zeigt das von mir beschriebene Verhalten Schritt für Schritt in einem SQLPLUS Script.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
SET TERM ON SET ECHO ON set serveroutput on SET VERIFY OFF SET HEADING ON SET FEEDBACK OFF Set Linesize 150 set pagesize 50000 -- Tabelle besserdich_test wird wieder geloescht Create table besserdich_test (id number, name varchar2(20)); PAUSE Weiter mit Enter -- Es werden ein paar Daten eingefuegt INSERT into besserdich_test (id,name) values (1,'BESSERDICH'); INSERT into besserdich_test (id,name) values (2,'IT'); INSERT into besserdich_test (id,name) values (3,'CONSULTING'); INSERT into besserdich_test (id,name) values (4,'ORACLE'); COMMIT; PAUSE Weiter mit Enter -- Ein Index auf die Spalte Namen wird erstellt create index besserdich_test_name_idx on besserdich_test(name); PAUSE Weiter mit Enter -- Wir sehen, dass wir einen validen Index mit 4 eindeutigen Werten haben. -- Also genau das Verhalten, dass wird erwarten Select status,distinct_keys from user_indexes where index_name = Upper('besserdich_test_name_idx'); PAUSE Weiter mit Enter -- Jetzt setzen wir den Index auf Unusable, sodass wir z.B. einen Direct Load auf die Tabelle durchfuehren koennen alter index besserdich_test_name_idx unusable; PAUSE Weiter mit Enter -- Wie zu erwarten, ist der Index Invalide Select status,distinct_keys from user_indexes where index_name = Upper('besserdich_test_name_idx'); PAUSE Weiter mit Enter -- Ich truncate die Daten nun um meinen Direct Load auf eine leere Tabelle auszufuehren truncate table besserdich_test; PAUSE Weiter mit Enter -- Nun kommt ein Verhalten mit dem ich nicht gerechnet habe, der Index ist wieder VALID! -- Also kein Direct Load mehr moeglich. Select status,distinct_keys from user_indexes where index_name = Upper('besserdich_test_name_idx'); PAUSE Weiter mit Enter -- Wichtig nach einem Truncate den Index nochmals auf unusable setzen! alter index besserdich_test_name_idx unusable; PAUSE Weiter mit Enter -- Nun koennte der DIRECT LOAD ausgefuehrt werden! PROMPT .... PAUSE Weiter mit Enter -- Tabelle besserdich_test wird wieder geloescht drop table besserdich_test; |
SCHREIBEN SIE EINEN KOMMENTAR