Home » Oracle » Oracle Ebuisness Suite » Why pinning objects into the shared pool?

Why pinning objects into the shared pool?

What  is the pinning in Shared pool

Oracle Applications requires space in the ORACLE System Global Area (SGA) for stored packages and functions. If SGA space is fragmented, there may not be enough space to load a package or function. You should pre-allocate space in the SGA shared pool for packages, functions, and sequences by “pinning” them.

Pinning objects in the shared pool can provide a tremendous increase in database performance, if it is done correctly. Since pinned objects reside in the SQL and PL/PLSQL memory areas, they do not need to be loaded and parsed from the database, which saves considerable time.

Also it may be good in case of sequence where you dont want the gap in the number.Pinning will make sure sequence are not aged out of shared pool.

How to choose the objects to be pinned

SELECT substr(owner,1,10)||'.'||substr(name,1,35) "Object Name",
' Type: '||substr(type,1,12)||
' size: '||sharable_mem ||
' execs: '||executions||
' loads: '||loads||
' Kept: '||kept
FROM v$db_object_cache
WHERE type in ('TRIGGER','PROCEDURE','PACKAGE BODY','PACKAGE')
AND executions > 0
ORDER BY executions desc,
loads desc,
sharable_mem desc;

Choose the objects with a high number of executions (EXECS) or very large (SPACE(K)), frequently used objects. If the decision is between two objects that have been executed the same number of times, then preference should be given to the larger object. From experience, very good results have been achieved with having pinned only about 10 packages

How to pin the objects in shared pool

Here is the sql statement to pin the package FND_PROFILE

execute dbms_shared_pool.keep('APPS.FND_PROFILE','P');

Similarly statement to pin the sequence

exec dbms_shared_pool.keep('OK_JOB_NUMBER_S', 'Q');

A cursor can be also pinned using the address and the hash_value of the cursor which can be found in the V$SQL view. To identify the cursor a select can be used similar to:

select address,hash_value
from v$sql
where sql_text like '%&IDENTIFIABLE_SQL_TEXT%';

exec DBMS_SHARED_POOL.KEEP( 'ADDRESS,HASH_VALUE' , 'C' );

We can unkeep the cursor using

exec DBMS_SHARED_POOL.UNKEEP('ADDRESS,HASH_VALUE','C');

These statement need to be executed after every startup of database and on each instance.
I would recommend creating a database startup trigger to perform all these  pinning

See also  How to solve ORA-29283 : invalid file operation

How to unpin the Objects in Shared pool

exec dbms_shared_pool.unkeep('<SEQUENCE_NAME>', 'q')

exec dbms_shared_pool.unkeep('<PACKAGE_NAME>', 'P')

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top