Eigentlich hatte ich angenommen, die Regeln der nologging-clause einigermaßen genau zu kennen. Das war aber wohl ein Irrtum. Zu meiner Überraschung ist es nämlich offenbar nicht möglich, die redo-Generierung für Indizes bei direct-path-Inserts zu vermeiden. Hier noch mal die Details zum Mitschreiben:
- im NOARCHIVELOG-Modus erzeugt ein INSERT /*+ append */ nur minimale redo Informationen
- allerdings werden redo-Informationen für zugehörige Indizes erzeugt
- dies geschieht auch dann, wenn der Index in den nologging Modus gesetzt wurde
- nologging spielt für Indizes nur bei rebuild-Operationen eine Rolle
Damit diese Aussagen nicht reine Behauptungen bleiben, hier die zugehörigen Tests:
create table test as select * from dba_objects where 1 = 0;
Tabelle wurde erstellt.
insert into test select * from dba_objects;
54496 Zeilen wurden erstellt.
--> 5982892 redo size
-- nach rollback:
insert /*+ append */ into test select * from dba_objects;
54496 Zeilen wurden erstellt.
--> 2328 redo size
--> dabei spielt das logging-Attribut der Tabelle im vorliegenden NOARCHIVELOG-Modus keine Rolle
-- nach rollback:
create index test_idx1 on test(object_name);
Index wurde erstellt.
insert /*+ append */ into test select * from dba_objects;
54497 Zeilen wurden erstellt.
--> 3799568 redo size
alter index test_idx1 nologging;
Index wurde geändert.
insert /*+ append */ into test select * from dba_objects;
54497 Zeilen wurden erstellt.
--> 3799568 redo size
--> der nologging-Modus des Index spielt im Fall des INSERTs keine Rolle
--> Änderungen am Index werden immer geloggt
--> für größere Änderungsoperationen ist demnach ein kompletter Neuaufbau des Index vorzuziehen
-- nach rollback:
alter index test_idx1 unusable;
Index wurde geändert.
insert /*+ append */ into test select * from dba_objects;
54497 Zeilen wurden erstellt.
--> 1888 redo size
alter index test_idx1 rebuild;
Index wurde geändert.
--> 60180 redo size
--> minimale redo Generierung für das rebuild eines Index im nologging-Modus
Keine Kommentare:
Kommentar veröffentlichen