Author's name: Jonathan Lewis Author's Email: Jonathan@jlcomp.demon.co.uk |
Date written: 18th July 2002 Oracle version(s): 8.1.7.0 |
Looking at view v$access or user_objects, you will sometimes find objects of type NON-EXISTENT. What are they ? |
There are two issues which result in non-existent objects.
If you drop an object, then it's row in obj$ (the table holding object definitions) is reclassified as type# = 10 (non-existent). If you create a new object before the database is shutdown, this object number (and row) can be re-used. This is an efficiency thing, and stops the obj$ table and its index degenerating over time in systems where objects are frequently dropped and created.
The other reads is that non-existent objects are created to handle 'negative dependency' tracking.
Say you have a view defined by
create or replace view v1 as select * from t1;
but T1 is actually a public synonym to a table in someone else's schema.
The validity of this view is dependent on the fact that there is no object named T1 in your schema; so Oracle creates a non-existent object in your schema that the view is dependent on (take a look at the view user_dependencies). Then, when you create an object called T1 in your schema, this causes the elimination of the 'non-existent' object, which automatically causes the invalidation and recompilation of the view so that it now references your object T1, rather than the public synonyn T1.
Further reading: Steve Adams has a couple of articles about the cost of public synonyms on his website www.ixora.com.au