You can do all this in an easier way, by setting the mat_view with refresh on commit option and if possible, also to make it refresh fast on commit. This will guarantee you that each time a change occurs the view will refresh only the new lines (compared to complete refresh, where the query behind the view is executed as a whole).
Now this last method can cause a lot of problems, because the refresh fast on commit option has limitations and if you can't comply with it, you just can't use it. If you can however set this to refresh complete on commit, this can either slow the system as you suggested happens from time to time and also suggests that you can't isolate the source of change.
If you want to see where the most frequent change occurs, I suggest you to use a custom table (per day) where to store the daily result of the query behind the mat_view. Then after a few days, just do something like:
select * from daily_table_day_one
minus
select * from mat_view
union all
select * from mat_view
minus
select * from daily_table_day_one
as the method with ORA_ROWSCN
not always works. The method with the triggers works in limited cases and if it isn't required to create those triggers on like 100 tables ... that's ludicrous.
When you find the source of change - for example several columns, coming from some tables, then you might consider rewriting the mat_view query, following some DW principles and create a star schema of the query. This will segment the query and will most certainly speed-up the query. Check where the load is coming from - if those expensive joins, scans whatever can't be avoided, maybe breaking down the query on smaller queries can do the trick if you can materialize them as well, maybe you can set them with refresh fast on commit as well.
It all depends on the implementation. If you can give here an example of the query or a part of it,with the explain plan we can also give you concrete solutions to it.
cheers