Fresh views on refresh views
So, you have got those MV in place and now need to keep them up to date, well there are three options: do-it-yourself, Complete refresh and 'Fast' refresh. To me, fast is not the right name, as under the covers all of the rows affected by data change are updated, this can be quick or mind-blowingly slow.
Complete refresh is simple to understand (just rebuild the table) but in a data warehouse with massive partitioned MVs and only the most recent data changing is perhaps the least useful. Fast (or as I prefer 'changes' ) sounds just the thing. But there is a price to this, well not one price but several: storage for the extra columns needed in the view to hold counts, storage for the extra log tables required to track changes, storage for the index required to locate changes rows quickly, not to mention the overhead of maintaining these structures - undoubtedly, having change logs slows operations on the logged tables.
Perhaps, the biggest drawback with Oracle 9.2 MVs is the way that changes are propagated on partitioned MVs. When partition DDL operations are carried out on an MV (such as create or drop partition) the MV becomes STALE, fast refresh won't work because of the previous partition operation. So you do a 'consider fresh' on the MV and then do a fast refresh, but this then runs row by row by slow and not as PCT partition based change. Working with Oracle's development team produced an experimental patch (controlled by setting an event in the database) and for which we are grateful that allowed us exploit partition change tracking's truncate and append approach to refresh. However the other gotcha is the risk of losing data if consider fresh is not carried out immediately after the partition ops and before the data insert into the parent table.
The do-it-yourself option is basically simple, you write the code to maintain the MV's content. For one of our customers it's just a simple case of writing code to truncate a partition and append into it, followed by marking the view as fresh.