Oracle has a great article on this task and makes recommendations as to what should be pinned.
You can also run this script to get an idea of what is going on in your SP.
Of course you can modify it to check the number of executions and such.Code:SELECT owner, name, o.type, sharable_mem, loads, executions, kept FROM v$db_object_cache o WHERE loads > 0 AND o.type in ('PACKAGE', 'FUNCTION', 'PROCEDURE', 'TRIGGER', 'SEQUENCE') ORDER BY sharable_mem DESC
Just to give you an example of why pinning objects are a good thing. Lets look at this.
If you notce the dbms_pipe is not kept and look how many times Oracle had to load him into memory.Code:SUBSTR( SUBSTR( TYPE LOADS EXECUTIONS KEP ------- ------- ---------------------------- ---------- ---------- --- SYS DBMS_PI PACKAGE 1932 678695 NO SYS DBMS_LO PACKAGE 581 576015 NO SDE PINFO_U PACKAGE 50 1092836 NO MPI2 TA_SIP_ TRIGGER 35 366824 NO MPI2 SPCOL_D TRIGGER 35 154010 NO MPI2 TIB_DML TRIGGER 18 4017861 NO MPI2 TXP_DEV TRIGGER 9 105112 NO MPI2 TTL_DEV TRIGGER 6 106664 NO MPI2 TA_SIP_ TRIGGER 6 106665 NO MPI2 TSDE_DE TRIGGER 6 105117 NO SDE LOCK_UT PACKAGE 5 3057220 YES SUBSTR( SUBSTR( TYPE LOADS EXECUTIONS KEP ------- ------- ---------------------------- ---------- ---------- --- SYS DBMS_UT PACKAGE 4 221480 YES SDE SDE_UTI PACKAGE 4 4500938 YES
This was taken 30 minutes after the above as executed and dbms_pipe was pinned. Notice how the loads have stopped?
One other thing you can look at if you're having problems with your shared pool is the SQL that's being put in there. As of Oracle9i there's a new parameter for cursor_sharing that's called similar. This is great to use if your app has a problem with not using bind variables.Code:SUBSTR( SUBSTR( TYPE LOADS EXECUTIONS KEP ------- ------- ---------------------------- ---------- ---------- --- SYS DBMS_PI PACKAGE 1935 680144 YES
You can also implement your db_keep_cache_size parameter this is used for when you want to cache your tables.
I hope this helps and good luck.




Reply With Quote