Database Editions and adop

A fairly common topic of discussion within the E-Business Suite DBA community is “How many editions can I have?” This was once again true at the recent Ascend conference. While there is not a simple correct answer to this question, it is a fact that the number of editions you have in your database directly impacts the size of OBJ$ and the size of OBJ$ can impact your performance. Which in a way does give us a simple answer, “As few as possible.” How do you control the number of editions in your EBS database? The answer is to make sure you at least occasionally include the actualize_all phase in your patching cycle.

Every time you run, adop phase=prepare, you create a new edition in your database. Any objects created or compiled in that edition are actualized, the rest are stubs which just point to the earlier edition when the object was actualized. Oracle gives us a useful report to look at the state of the objects by edition, $AD_TOP/sql/ADZDSHOWOBJS.sql.

=========================================================================
=                      Editioned Objects Per Edition
=========================================================================

EDITION_NAME       A_VALID  A_INVALID    A_TOTAL    S_VALID  S_INVALID    S_TOTAL      TOTAL
--------------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
V_20250517_0907     111770      38764     150534          0          0          0     150534
V_20250601_1535        160         67        227     150534          0     150534     150761
V_20250614_0920         28         16         44     150726          0     150726     150770
V_20250615_1247     291785         40     291825          0          0          0     291825

Note :
(A_) - Actual Objects
(S_) - Stub Objects

This is an example output while the database is in the process of getting rid of the old editions. With 19c, the cleanup phase tells the database to get rid of the old editions in the background after doing an actualize_all phase instead of actually doing it immediately. This is why the total number of objects in the previous editions is so much smaller than the current edition. You can also confirm that the previous editions are unusable by querying DBA_EDITIONS in the database.

SQL> select * from dba_editions;

EDITION_NAME         PARENT_EDITION_NAME  USABLE
-------------------- -------------------- --------
V_20250517_0907                           NO
V_20250614_0920      V_20250601_1535      NO
V_20250601_1535      V_20250517_0907      NO
V_20250615_1247      V_20250614_0920      YES

SQL>

When the cleanup is complete, only V_20250615_1247 will be left as an edition, the unusable editions will have been dropped.

You can get an idea of the work that will be involved if you run adop phase=actualize_all by looking at the output of ADZDSHOWOBJS.sql. If a significant percentage of the total packages are already actualized, then it should not take as long to instantiate the objects in the current patch edition. Having said that, it has been my observation with AD/TXK delta 16 and 19c (19.24+) that concurrency and system load are at least as large a factor. I have had actualize_all take from as little as 10 minutes to over an hour in different environments (patching sandbox, development, test, and production). In the most recent round of patching, testing was the slowest and development was the fastest. However since I am doing my patching against a live system, as long as the longest it took in non-production is less than half the time remaining after I complete patching in production before my scheduled outage for the cutover phase, I will run actualize_all (in practical terms, this means that I will always include the actualize_all phase in my patch sessions). This also means that if I do need to skip it in one patch cycle, it is unlikely to cause me any pain either in performance or space usage.

If you would like to test this for yourself realize that in spite of our normal diagram for a patch cycle:

It is actually

In other words, when you are not in a patch cycle (after cleanup and before prepare), you can run fs_clone or prepare. After running prepare, you can run apply, actualize_all, and finalize as much as you want as long as you end with finalize before doing cutover. And, of course, you can run abort at any time prior to cutover. You must always end with cleanup. This means if you have applied your patches and run the finalize phase and then find another patch or which to actualize the objects to cleanup the old editions, you can do so and just run another finalize phase. This has been confirmed by the EBS ATG group (the development group that owns adop) at Oracle. This means that you can test the extra time needed just for actualize_all by applying all your patches and completing a finalize phase then doing an actualize_all and finalize (realize that this will be high since certain activities will be repeated in the second finalize). Of course this will not test the impacts from concurrency so it still could run longer in another environment.

The TLDR version of this post is that in any normal patching cycle, I will run actualize_all instead of keeping the extra editions.

What will you do?

Related Posts

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.