NOLOGGING is restricted to a very limited set of commands, such as
alter table move alter index rebuild (which answers
part (b)).
The /*+ APPEND */ hint instructs Oracle that it should
not generate UNDO (rollback) for the table - instead it should lock the
table so that the highwater mark cannot be moved by other users, insert
into blocks above the highwater mark, and then jump the highwater mark on
commit. Since no-one else can see the space above the highwater mark,
no-one needs to be able to rollback - i.e. there is no need for UNDO, and
since the table is NOLOGGING, there is no 'pure' redo. However, index
entries go into the correct location in the index - you can't put new
index entries "where no-one can see them" - consequently other users have
to be able to roll back those entries - which means you have to generate
UNDO for the index - and the UNDO has to be protected by redo. /*+ APPEND
*/ has no effect on indexes. In theory, I guess oracle could decide to NOT
generate redo for the index at this point - but since it is piggybacking
ordinary array inserts, and since the operation is generating redo for
UNDO, I guess Oracle decided that there was no point in writing special
code to bypass the redo.
|