Skip to Main Content
  • Questions
  • Parallel Execution and the Large Pool

Breadcrumb

Question and Answer

Tom Kyte

Thanks for the question, Brian.

Asked: January 09, 2002 - 4:42 pm UTC

Last updated: February 20, 2007 - 9:48 am UTC

Version: 8.1.6

Viewed 1000+ times

You Asked

My understanding is that if parallel execution is enabled (PARALLEL-AUTOMATIC_TUNING = TRUE) and we actually set a DOP for the tables/indexes we want parallelized, then Oracle will use the Large Pool is used instead of the Shared Pool when processing these objects (or any time we force parallelism with hints). Is this true?

and Tom said...

The large pool is used for the PQ messages -- not for anything else. Yes, it is true.

the shared pool is for memory that "ages" (age this sql plan out after no one has used it)

the large pool is for memory that has a lifetime -- allocate it, use it, free it. PQ messages, UGA's in shared server mode, rman IO -- they all use the large pool.

Rating

  (18 ratings)

Is this answer out of date? If it is, please let us know via a Comment

Comments

a bit more clarification required

Brian Davies, January 11, 2002 - 9:23 am UTC

At our sight, we're not using MTS or RMAN, nor are we using Oracle Parallel Server . We have several independent servers, each with varying numbers of CPUs (some have 1; some have 3; some have 6) and varying numbers of disks for storage.

Our objective is to enable and use parallel execution. We're trying to figure out whether Oracle will use the large pool, and how big we should make the pool.

In your book (pg 83), you state that the large pool is used by:

MTS;
Parallel Execution to coordinate parallel query servers;
RMAN Disk I/O buffers.

I interpret this to mean the Oracle will use the large pool for parallel execution query servers, even though we are not using MTS, RMAN, or parallel server (i.e. multiple machines).

Is my interpretation correct?

What views/tables should we look at to monitor Large Pool usage?


Tom Kyte
January 11, 2002 - 1:27 pm UTC

Correct.

v$sgastat is the view that shows you large pool utilization.

Large Pool Sizing

Andre, June 18, 2002 - 12:36 pm UTC

I've read as a quirk that setting PARALLEL_AUTOMATIC_TUNING=TRUE has a very useful side-effect of automatically and dynamically sizing the large pool, not only for parallel operations, but for the other cases as well (rman, mts, etc), preventing it from getting crowded -- so we don't have to worry about sizing it manually. What do you think of it ?

Tom Kyte
June 18, 2002 - 2:24 pm UTC

Well, as for having it be set for MTS (shared server), I'm not sure I'd let it do that. It'll look at the mts_dispatchers to figure out what to allocate for that -- so unless your sessions is set dead on and you use the "right" amount of uga memory in your sessions, you'll be wanting to set this yourself (as the parameter definition suggests you might).



Where are parallel query messages buffered

Dale Ware, March 06, 2003 - 9:23 am UTC

Tom,

I am curious about where the PQ messages are buffered when the parameters LARGE_POOL, DBWn_IO_SLAVES and PARALLEL_AUTOMATIC_TUNING are not set.

Would the shared pool be used under these circumstances?



Tom Kyte
March 06, 2003 - 9:50 am UTC

large_pool_size will be set for you if you have pq configured.

....
Otherwise, derived from the values of PARALLEL_MAX_ SERVERS, PARALLEL_THREADS_PER_CPU, CLUSTER_ DATABASE_INSTANCES, DISPATCHERS, and DBWR_IO_ SLAVES.
.........


and each of those has defaults as well.

answer = large pool

Parallel Query/execution

A reader, May 17, 2003 - 12:47 pm UTC

Tom,
The production system we have is a busy OLTP, a few hundred concurrent users and we will have more users coming. Someone has been recommending to set:
PARALLEL-AUTOMATIC_TUNING = TRUE for the Database. Do you think it right?

Thanks so much

Tom Kyte
May 17, 2003 - 3:18 pm UTC

nope.

not at all.

OLTP queries are characterized by

o small
o fast


parallel query is used to execute

o big, huge
o long running

queries.


If you have big huge long running queries, you do not have an oltp system.

Monitoring large pool memory consumption.

Jay Nelson, January 13, 2004 - 10:09 am UTC

The answers were very concise (and made sense). Very nice.


parallel_automatic_tuning=TRUE?

Vinnie, February 05, 2004 - 12:57 pm UTC

Tom,

I have a table that is dynamically created at run time. This table is loaded with data via a JAVA app & speed is essential. The developers are considering multithreading the app. IN your opinion would it help to set parallel_automatic_tuning=TRUE & create the table with the parallel clause?

If so, do we need to do anything else in the INSERT or SELECT statements against this table to utilize the parallelizm?
THanks

Tom Kyte
February 06, 2004 - 8:13 am UTC

you want to do it fast, do SQL stuff in plsql and use external tables and BULK operations (like insert /*+ append */ and maybe parallel query)


if you have a program doing "insert into tables values...." -- parallel = "no-op" for you. the client would have to do all of the parallelization.

if you want the least code that runs the fastest -- that'll be plsql with external tables using bulk operations.



Good

Gururaj, March 03, 2004 - 1:04 am UTC

Hi Tom,
When we use a parallel hint,what can be the maximium no.of
processes that can be started in parallel by the system and
also what is the max.number of instances that an Oracle database can have?
Thanks in advance.


No Need to set parallel_automatic_tuning=true

nn, May 13, 2004 - 2:32 am UTC

enviroment 1

show parameter parallel


NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
fast_start_parallel_rollback string LOW
log_parallelism integer 1
parallel_adaptive_multi_user boolean TRUE
parallel_automatic_tuning boolean TRUE
parallel_execution_message_size integer 4096
parallel_instance_group string
parallel_max_servers integer 160
parallel_min_percent integer 0
parallel_min_servers integer 0
parallel_server boolean FALSE
parallel_server_instances integer 1
parallel_threads_per_cpu integer 2
recovery_parallelism integer 0

Execute DBMS_STATS.GATHER_TABLE_STATS(OWNNAME =>'GCA_USER',TABNAME => 'GCA_BOOKING_DETAIL',ESTIMATE_PERCENT =>20,degree => 3);



STATUS PROGRAM MODULE LOGON_TIME LAST_CALL_ET PDM PDDL_STA CURRENT_QUEUE_DURATION
-------- ----------------------- -------- -------------- ----- --- ------ ----------------------
ACTIVE oracle@ned (P000) SQL*Plus 13-MAY-2004 05:24:01 2464 NO ENABLED 0
ACTIVE oracle@ned (P002) SQL*Plus 13-MAY-2004 05:24:01 2464 NO ENABLED 0
ACTIVE oracle@ned (P001) SQL*Plus 13-MAY-2004 05:24:01 2464 NO ENABLED 0
ACTIVE oracle@ned (P005) SQL*Plus 13-MAY-2004 05:24:01 2466 NO ENABLED 0
ACTIVE oracle@ned (P004) SQL*Plus 13-MAY-2004 05:24:01 2466 NO ENABLED 0
ACTIVE sqlplus@ned (TNS V1-V3) SQL*Plus 13-MAY-2004 05:23:10 2470 YES ENABLED 0
ACTIVE oracle@ned (P003) SQL*Plus 13-MAY-2004 05:24:01 2466 NO ENABLED 0


enviroment 2


fast_start_parallel_rollback string LOW
log_parallelism integer 1
parallel_adaptive_multi_user boolean FALSE
parallel_automatic_tuning boolean FALSE
parallel_execution_message_size integer 2152
parallel_instance_group string
parallel_max_servers integer 5
parallel_min_percent integer 0
parallel_min_servers integer 0
parallel_server boolean FALSE
parallel_server_instances integer 1
parallel_threads_per_cpu integer 2
recovery_parallelism integer 0


Execute DBMS_STATS.GATHER_TABLE_STATS(OWNNAME =>'GCA_USER',TABNAME => 'GCA_BOOKING_DETAIL',ESTIMATE_PERCENT =>20,degree => 3);


STATUS PROGRAM MODULE LOGON_TIME LAST_CALL_ET PDM PDDL_STA CURRENT_QUEUE_DURATION
-------- ------------------------------------------------ ------------------------------------------------ -------- ------------ ------------
ACTIVE oracle@tosk (P001) SQL*Plus 13-MAY-2004 06:15:34 35 NO ENABLED 0
ACTIVE oracle@tosk (P000) SQL*Plus 13-MAY-2004 06:15:34 35 NO ENABLED 0
ACTIVE oracle@tosk (P003) SQL*Plus 13-MAY-2004 06:15:34 35 NO ENABLED 0
ACTIVE oracle@tosk (P004) SQL*Plus 13-MAY-2004 06:15:34 35 NO ENABLED 0
ACTIVE sqlplus@tosk (TNS V1-V3) SQL*Plus 13-MAY-2004 06:02:01 35 YES ENABLED 0




Tom Kyte
May 13, 2004 - 10:20 am UTC

care to share what you are trying to say here?




Shared server config

reader, May 14, 2004 - 12:46 pm UTC

(1) Is memory for "Response Queue" and "Request Queue" for Dispatchers in Shared Server Configuration allocated in Large Pool or somewhere in the SGA?

(2) Is there a view that would tell me this much memory was used for Response and Request Queue in the SGA?Thanks.

Tom Kyte
May 15, 2004 - 11:09 am UTC

it is in the SGA variable size. I do not know of a documented way to view the current sizes.

Oracle Documentation on PARALLEL_AUTOMATIC_TUNING

Vivek Sharma, May 21, 2004 - 3:38 pm UTC

Dear Tom,

Chapter 7 of Oracle 9i Documentation states about the Shared Pool as
"The shared pool portion of the SGA contains three major areas: library cache, dictionary cache, buffers for parallel execution messages, and control structures."

Then it gives a note as
"If the initialization parameter PARALLEL_AUTOMATIC_TUNING is set to true, these buffers are allocated from the large pool."

This is a bit confusing. I recollect, once an Oracle Support Executive visited our organization for RAC Implementation and wanted this parameter to be set to true. In RAC, I can understand that the locking details are maintained in Shared Pool thus to reduce the load on the shared pool, this parameter needs to be set so that Large Pool can be used.

My Question is :
1. If this parameter is set to TRUE, irrespective of RAC and Non RAC, will Large Pool behave like Shared Pool. i.e.will parsing of SQL Statements is done in Large Pool.

2. Can this be set on Non -RAC Databases ? If yes, then what is the advantage ?

3. What are other benefits of this parameter ?

I apologize for the amount of question I have asked but will appreciate this knowledge sharing from you.

Thanks and Regards
Vivek

Tom Kyte
May 22, 2004 - 11:17 am UTC

the large pool is used if configured, else the shared pool is used.

the large pool is used for "non-lru" type of memory allocations, of which UGA, RMAN, PQ are. If you are using those features (regardless of automatic or not), you would want to configure a large pool period.


1) large pool will not hold SQL, it'll hold UGA for shared server, rman buffers and PQ message buffers


Large Pool and Direct path insert

Wolfgang, January 08, 2006 - 12:30 pm UTC

Hi Tom,
I currently have a discussion about Large Pool and Direct path inserts at the Oracle Database Forum (Nick=dimitri).
Perhaps you could clarify the questions which came up:

</code> http://forums.oracle.com/forums/thread.jspa?threadID=351967&tstart=0 <code>

Regards
Wolfgang

Tom Kyte
January 09, 2006 - 7:52 am UTC

I commented in the thread.

Thanks

Wolfgang, January 10, 2006 - 3:41 am UTC

Thanks a lot Tom :-)

parallel execution and RAC

Karmit, February 07, 2006 - 3:16 am UTC

Hi Tom,
Trying to find an answer to this within Metalink and asktom, but not able to do so (yet!), so stealing your CPU cycles as a last resort.
We have just implemented 2 node 10g RAC. Now, if I execute a parallel operation while logged on to instance 1, the parallel slaves start up on instance 2 (nothing else is running on the boxes, I mean apart from essential OS services). I understand it tries to balance stuff and therefore the parallel slaves start up on whichever node it thinks best. My question is:

Is there a way to control this behaviour? Reason is - I
want to perform loading on a huge tables, which are
range-list partitioned by a certain code, and I "know"
that certain partitions are bigger than the rest and
hence want to divide the work up between the instances
manually. My "logic" being that since the instances
will be working on different partitions of the same
table - there should be less pressure on the
interconnect. However, if I cannot control the parallel
slaves then I cannot guarantee exclusive work on the
partitions within the instances.

I could be thinking in a completely wrong direction! any suggestions appreciated.

Thanks,
karmit



Tom Kyte
February 07, 2006 - 5:38 am UTC

you can prevent queries from

a) going parallel in a single instance
b) going parallel across instances

but you cannot control who does which bit of work where (unless you implement "do it yourself parallelism" - eg: not using the built in parallel stuff, but starting your own set of processes)

so you can stop it from starting parallel execution servers on the other node, keeping them all on the node you are on.

you can stop it from going parallel on the node you are on.

but you cannot say "node a, you do this, node b, you do that"

parallel execution and RAC

karmit, February 07, 2006 - 6:57 am UTC

Hi,

Did some more digging around and it seems that there's a 
parameter called "PARALLEL_INSTANCE_GROUP" which works in 
conjunction with "INSTANCE_GROUPS". This seems to address
my issue(?!).

So, will be testing this out:

a) Setting up instance 1 as Group 1


b) Setting up instance 2 as Group 2


c) SQL> alter session parallel_instance_group='GROUP1';
   SQL> <<run load 1 - meant to run only on instance 1>>
   

d) SQL> alter session parallel_instance_group='GROUP2';
   SQL> <<run load 2 - meant to run only on instance 2>>

(will be setting all tables/indexes to default degree+instance)

Would this work - as intended?

Regards,
Karmit
 

Tom Kyte
February 08, 2006 - 12:45 am UTC

that is the equivalent of "do it yourself parallelism", yes.

parallel execution and RAC

karmit, February 07, 2006 - 4:05 pm UTC

Tested this today and it does seem to work!!!

Basically, could control the exection of pq slaves per
instance using the parallel_instance_group parameter
in conjunction with instance_groups.

parallel_max_servers

Ian, February 19, 2007 - 11:16 am UTC

Tom

Is there a reason that parallel_max_servers cannot be changed on the fly? We have a situation whereby we want parallel_max_servers=72 at night but equal to zero during the day. Reason being that during the day we are heavily OLTP so we don't want PX - but at night we have huge snapshots to refresh so we need PX.

Is there anyway we can make it impossible to run PX during the day?

Obvioulsy we can just not run anything with a PX hint in it during the day - but that is not foolproof. The DOP on all our tables and Indexes is zero so PX should not kick in unless hinted - but statspack indicates that PX slaves are being used during the day.

Any advise gratefully received.

Regards

Ian
Tom Kyte
February 19, 2007 - 11:56 am UTC

well, you should have 72 set always in your case?!?

the OLTP queries would never use PQ and the batches would specifically ask for it.

Just do not parallel enable your segments (and PQ won't be used during OLTP) and ask for it during your batch.

but in any case

ops$tkyte%ORA10GR2> alter system set parallel_max_servers = 10;

System altered.

ops$tkyte%ORA10GR2> alter system set parallel_max_servers = 20
  2  ;

System altered.

ops$tkyte%ORA10GR2> alter system set parallel_max_servers = 0;

System altered.



10g does permit it.

parallel_max_servers

Ian, February 20, 2007 - 4:43 am UTC

Sadly we are on 9.2.0.7

That's basically the route we are probably going to go - but it does leave us open to someone running a (homegrown) snapshot refresh during the day. I was just wondering if there was anyway of disabling it during te day. Guess not.

Cheers

Ian
Tom Kyte
February 20, 2007 - 9:48 am UTC

well, you could use the resource manager:

http://docs.oracle.com/docs/cd/B10501_01/server.920/a96521/dbrm.htm#5080

and have a "day plan and a night plan"

you can use this
http://docs.oracle.com/docs/cd/B10501_01/server.920/a96521/dbrm.htm#16978
to

...
Limit the degree of parallelism of any operation performed by members of a group of users
......

Perfect

Ian, February 20, 2007 - 12:11 pm UTC

Thanks Tom - that's exactly what I was looking for.

Thanks and Regards

Ian

More to Explore

Backup/Recovery

Check out the complete guide to all of the Backup & Recovery techniques in the Oracle Database.