Automatic DOP and Oracle EBS

January 30th, 2012 | Written by John Clarke

 

What is Auto DOP?

Starting with 11g, Oracle introduced Automatic Degree of Parallelism, or Auto DOP.  I’ve blogged about this at http://www.centroid.com/knowledgebase/blog/automatic-degree-of-parallelism-in-oracle-11gr2.  I’m not going to review all the ins and outs of Auto DOP in this post.  Here, I’ll talk about a few things specific to Oracle e-Business Suite that are worth noting.

 

Enabling Auto DOP: First Tests

 

 

870

 

 

 

 

 

 

 

 

 

 

 

 

In order to take advantage of Auto DOP, we’ll need to color our tables with a “Default” degree of parallelism.   Below is a script that can be used to achieve what we want:

 

895

 

 

 

 

 

 

 

 

 

When this completed, I stopped and started the applications and when attempting to login to the front-end, I received this error:

 

872

 

 

 

 

Is this a consequence of giving everything a default DOP and configuring Auto DOP?   During this same general time period, we also saw the following PQ behavior in the SQL Monitoring window of EM Database Control:

 

873

 

 

 

 

 

As you can see, we witnessed 96-way DOPs, spanning both instances, for queries like these:

 

874

 

 

 

 

 

875

 

 

 

 

 

876

 

 

 

 

 

If we check the row counts of these tables, we can clearly see that they don’t have too many rows – so why did Auto DOP yield a DOP of 96 for these tables?

Part of the answer is in the fact that IO calibration statistics are missing.  We can see this from a simple Explain Plan on one of our queries above:

 

877

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

So let’s fix it:

 

878

 

 

 

 

 

 

 

 

Now that this is complete, let’s bounce and re-test:

 

879

 

 

 

 

 

 

 

In addition to being able to login to the Application, we also do not see inappropriate session with 96 parallel query slaves.  The takeaway from this experience is that you absolutely need to calibrate IO or else Auto DOP could greatly over-parallelize things queries and cause the application not to start.

 

 

Auto DOP and EBS: Other Observations

After coloring all the EBS Apps tables with a DEFAULT DOP, I noticed that several other sessions were running with a DOP=96, which is the system-calculated maximum. Let’s dig a little deeper into this “by looking at one of the SQL statements – see below, from SQL Monitoring:

 

880

 

 

 

 

 

 

 

As we can see, the SQL statement spawned the maximum number of PQ slaves as specified by (cpu_count * parallel_thread_per_cpu * parallel_server_instances).  If, however, I copy this SQL statement and run manually, I can see that no PQ slaves were launched, as we’d expect.  Also, if I run an EXPLAIN PLAN on it, I can that Auto DOP calculated a DOP of 1 for the statement:

 

881

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Upon further research, I noticed that the sessions spawning the 96 PQ slaves are all running by background processes; specifically, attached to SYS$BACKGROUND service and running inside a DBMS_AQ.AQIN package – part of normal Advanced Queuing de-queuing and en-queuing.  Since my individual tests above seemed to generate the appropriate DOP when run in isolation, I was leaning toward a couple other theories:

 

* Auto DOP is using the maximum DOP because it’s running from SYS$BACKGROUND service, or

* Auto DOP is calculating the max DOP because it’s running inside a PL/SQL package, or

* Auto DOP is calculating the max DOP because of some other reason.  I know, this seems like a cop-out …

 

On the second bullet, let’s create a test PL/SQL package to we can determine whether this is indeed the case.  I’ll grab one of the SQL cursors that we found as having been colored with a DOP of 96 for starters, from SQL Monitoring in EM:

 

882

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

If I run this package as SYS, the output and SQL Monitoring output looks like the below:

 

883

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

884

 

 

 

 

We can see that the session did not run with a DOP of 96 – which, to me, rules out the PL/SQL theory. This leads me to believe that the session we observed to run with a high DOP did so because they were initiated by Oracle background processes – something that may be difficult to prove and/or test. 


 

But let’s try using a “_px_trace” trace.  First, let’s enable things:

 

885

 

 

Now after starting the instance, we’ll find a session that used a DOP=96:

 

886

 

 

 

 

 

 

 

887

 

 

 

 

 

 

 

 

888

 

 

 

 

So we’ve got a trace file that shows PQ trace operations

 

889

 

 

 

 

 

 

 

 

 

 

Now let’s do a “normal” Auto DOP thing:

 

890

 

 

 

 

 

 

 

We saw it spawn 2 PQ slaves:

 

891

 

 

 

 

If we check the PX trace file, we see the below:

 

892

 

 

 

 

 

 

 

 

 

 

 

 

 

Compared with the initial, background slave process:

 

893

 

 

 

 

 

 

 

 

 

 

 

Now this does not tell us exactly why the background process estimated 96 slaves, specifically, but it does tell us that it did.  It would be more direct if we could do a SQL compiler trace on the background process, but I couldn't get this to show anything because by the time I was able to snap a 10053 trace on a background session, its SQL cursors had already been hard parsed so the 10053 traces didn’t show anything.  I suppose I could enable event 10053 system-wide but I shied away from this due to trace file space concerns. 

 

Based on these observations, it seems as if background process cursors will not qualify for Auto DOP calculations.

 

Summary

* Automatic DOP is a good thing, despite the anomalies with advanced queuing related background processes

* Make sure you calibrate IO for Auto DOP to work, and do this before you color all the EBS tables with a DEFAULT DOP

* For all EBS tables, do a “alter table <table name> parallel (degree default)” – except AQ tables

* For the AQ tables, set the DOP to 1, or noparallel.  The script below will do this and the previous bullet

 

894