Oracle LibraryCacheInternals JulianDyke

66
1 © 2006 Julian Dyke Library Cache Internals Julian Dyke Independent Consultant juliandyke.co Web Version

description

Oracle Performance Tuning - LibraryCacheInternals - JulianDyke

Transcript of Oracle LibraryCacheInternals JulianDyke

Library Cache InternalsSession arrays
Process arrays
Segmented arrays
Library Cache
-- If Automatic Memory Management
IF SGA_TARGET specified THEN
IF SHARED_POOL_SIZE specified THEN
ELSE
ELSE -- Manual memory management
IF SHARED_POOL_SIZE specified THEN
ELSE
Library Cache
Contains objects of various types required to parse and execute SQL statements including
tables
indexes
cursors
parent
child
PL/SQL
procedures
functions
packages
Types
methods
Object Types
Every object in the library cache has an object type. Object types include:
Type
juliandyke.com
Namespaces
Every object in the library cache belongs to a namespace Namespaces include:
Application Context
Stored Outline
Based on X$KGLOB
ALTER SESSION SET EVENTS
where <n> specifies information to be included
1 - include library cache statistics
2 - include library cache hash table
4 - include library cache handles and objects
8 - include dependencies, read-only dependencies, accesses, authorizations, translations, schemas and data blocks
16 - include sizes for data blocks
32 - include heap dumps for data blocks
All levels include permanent space allocation section
Above levels apply in Oracle 10.2
Dump levels vary in earlier versions
© 2006 Julian Dyke
Parent
Parent Cursor
One parent cursor for each textually different SQL statement in library cache
Statements identified by hash value
Generated from statement text
SQL_TEXT
VARCHAR2(1000)
SQL_FULLTEXT
CLOB
SQL_ID
VARCHAR2(13)
SHARABLE_MEM
NUMBER
PERSISTENT_MEM
NUMBER
RUNTIME_MEM
NUMBER
SORTS
NUMBER
VERSION_COUNT
NUMBER
LOADED_VERSIONS
NUMBER
OPEN_VERSIONS
NUMBER
USERS_OPENING
NUMBER
FETCHES
NUMBER
EXECUTIONS
NUMBER
PX_SERVERS_EXECUTIONS
NUMBER
END_OF_FETCH_COUNT
NUMBER
USERS_EXECUTING
NUMBER
LOADS
NUMBER
FIRST_LOAD_TIME
VARCHAR2(19)
INVALIDATIONS
NUMBER
PARSE_CALLS
NUMBER
DISK_READS
NUMBER
DIRECT_WRITES
NUMBER
BUFFER_GETS
NUMBER
APPLICATION_WAIT_TIME
NUMBER
CONCURRENCY_WAIT_TIME
NUMBER
CLUSTER_WAIT_TIME
NUMBER
USER_IO_WAIT_TIME
NUMBER
PLSQL_EXEC_TIME
NUMBER
JAVA_EXEC_TIME
NUMBER
ROWS_PROCESSED
NUMBER
COMMAND_TYPE
NUMBER
OPTIMIZER_MODE
VARCHAR2(10)
OPTIMIZER_COST
NUMBER
OPTIMIZER_ENV
RAW(797)
OPTIMIZER_ENV_HASH_VALUE
NUMBER
PARSING_USER_ID
NUMBER
PARSING_SCHEMA_ID
NUMBER
PARSING_SCHEMA_NAME
VARCHAR2(64)
KEPT_VERSIONS
NUMBER
ADDRESS
RAW(4)
HASH_VALUE
NUMBER
OLD_HASH_VALUE
NUMBER
PLAN_HASH_VALUE
NUMBER
MODULE
VARCHAR2(64)
MODULE_HASH
NUMBER
ACTION
VARCHAR2(64)
ACTION_HASH
NUMBER
SERIALIZABLE_ABOUTS
NUMBER
OUTLINE_CATEGORY
VARCHAR2(64)
CPU_TIME
NUMBER
ELAPSED_TIME
NUMBER
OUTLINE_SID
VARCHAR2(40)
LAST_ACTIVE_CHILD_ADDRESS
RAW(4)
REMOTE
VARCHAR2(1)
OBJECT_STATUS
VARCHAR2(19)
LITERAL_HASH_VALUE
NUMBER
LAST_LOAD_TIME
DATE
IS_OBSOLETE
VARCHAR2(1)
CHILD_LATCH
NUMBER
SQL_PROFILE
VARCHAR2(64)
PROGRAM_ID
NUMBER
PROGRAM_LINE#
NUMBER
EXACT_MATCHING_SIGNATURE
NUMBER
FORCE_MATCHING_SIGNATURE
NUMBER
LAST_ACTIVE_TIME
DATE
BIND_DATA
RAW(2000)
SQL_TEXT
VARCHAR2(1000)
SQL_FULLTEXT
CLOB
SQL_ID
VARCHAR2(13)
SHARABLE_MEM
NUMBER
PERSISTENT_MEM
NUMBER
RUNTIME_MEM
NUMBER
SORTS
NUMBER
VERSION_COUNT
NUMBER
LOADED_VERSIONS
NUMBER
OPEN_VERSIONS
NUMBER
USERS_OPENING
NUMBER
FETCHES
NUMBER
EXECUTIONS
NUMBER
PX_SERVERS_EXECUTIONS
NUMBER
END_OF_FETCH_COUNT
NUMBER
USERS_EXECUTING
NUMBER
LOADS
NUMBER
FIRST_LOAD_TIME
VARCHAR2(19)
INVALIDATIONS
NUMBER
PARSE_CALLS
NUMBER
DISK_READS
NUMBER
DIRECT_WRITES
NUMBER
BUFFER_GETS
NUMBER
APPLICATION_WAIT_TIME
NUMBER
CONCURRENCY_WAIT_TIME
NUMBER
CLUSTER_WAIT_TIME
NUMBER
USER_IO_WAIT_TIME
NUMBER
PLSQL_EXEC_TIME
NUMBER
JAVA_EXEC_TIME
NUMBER
ROWS_PROCESSED
NUMBER
COMMAND_TYPE
NUMBER
OPTIMIZER_MODE
VARCHAR2(10)
OPTIMIZER_COST
NUMBER
OPTIMIZER_ENV
RAW(797)
OPTIMIZER_ENV_HASH_VALUE
NUMBER
PARSING_USER_ID
NUMBER
PARSING_SCHEMA_ID
NUMBER
PARSING_SCHEMA_NAME
VARCHAR2(64)
KEPT_VERSIONS
NUMBER
ADDRESS
RAW(4)
HASH_VALUE
NUMBER
OLD_HASH_VALUE
NUMBER
PLAN_HASH_VALUE
NUMBER
MODULE
VARCHAR2(64)
MODULE_HASH
NUMBER
ACTION
VARCHAR2(64)
ACTION_HASH
NUMBER
SERIALIZABLE_ABOUTS
NUMBER
OUTLINE_CATEGORY
VARCHAR2(64)
CPU_TIME
NUMBER
ELAPSED_TIME
NUMBER
OUTLINE_SID
VARCHAR2(40)
LAST_ACTIVE_CHILD_ADDRESS
RAW(4)
REMOTE
VARCHAR2(1)
OBJECT_STATUS
VARCHAR2(19)
LITERAL_HASH_VALUE
NUMBER
LAST_LOAD_TIME
DATE
IS_OBSOLETE
VARCHAR2(1)
CHILD_LATCH
NUMBER
SQL_PROFILE
VARCHAR2(64)
PROGRAM_ID
NUMBER
PROGRAM_LINE#
NUMBER
EXACT_MATCHING_SIGNATURE
NUMBER
FORCE_MATCHING_SIGNATURE
NUMBER
LAST_ACTIVE_TIME
DATE
BIND_DATA
RAW(2000)
Each parent cursor can have one or more child cursors
Child cursor contains
© 2006 Julian Dyke
SQL_TEXT
VARCHAR2(1000)
SQL_FULLTEXT
CLOB
SQL_ID
VARCHAR2(13)
SHARABLE_MEM
NUMBER
PERSISTENT_MEM
NUMBER
RUNTIME_MEM
NUMBER
SORTS
NUMBER
LOADED_VERSIONS
NUMBER
OPEN_VERSIONS
NUMBER
USERS_OPENING
NUMBER
FETCHES
NUMBER
EXECUTIONS
NUMBER
PX_SERVERS_EXECUTIONS
NUMBER
END_OF_FETCH_COUNT
NUMBER
USERS_EXECUTING
NUMBER
LOADS
NUMBER
FIRST_LOAD_TIME
VARCHAR2(19)
INVALIDATIONS
NUMBER
PARSE_CALLS
NUMBER
DISK_READS
NUMBER
DIRECT_WRITES
NUMBER
BUFFER_GETS
NUMBER
APPLICATION_WAIT_TIME
NUMBER
CONCURRENCY_WAIT_TIME
NUMBER
CLUSTER_WAIT_TIME
NUMBER
USER_IO_WAIT_TIME
NUMBER
PLSQL_EXEC_TIME
NUMBER
JAVA_EXEC_TIME
NUMBER
ROWS_PROCESSED
NUMBER
COMMAND_TYPE
NUMBER
OPTIMIZER_MODE
VARCHAR2(10)
OPTIMZER_COST
NUMBER
OPTIMZER_ENV
RAW(797)
OPTIMZER_ENV_HASH_VALUE
NUMBER
PARSING_USER_ID
NUMBER
PARSING_SCHEMA_ID
NUMBER
PARSING_SCHEMA_NAME
VARCHAR2(30)
KEPT_VERSIONS
NUMBER
ADDRESS
RAW(4)
TYPE_CHK_HEAP
RAW(4)
HASH_VALUE
NUMBER
OLD_HASH_VALUE
NUMBER
PLAN_HASH_VALUE
NUMBER
CHILD_NUMBER
NUMBER
SERVICE
VARCHAR2(64)
SERVICE_HASH
NUMBER
MODULE
VARCHAR2(64)
MODULE_HASH
NUMBER
ACTION
VARCHAR2(64)
ACTION_HASH
NUMBER
SERIALIZABLE_ABORTS
NUMBER
OUTLINE_CATEGORY
VARCHAR2(64)
CPU_TIME
NUMBER
ELAPSED_TIME
NUMBER
OUTLINE_SID
NUMBER
CHILD_ADDRESS
RAW(4)
SQLTYPE
NUMBER
REMOTE
VARCHAR2(1)
OBJECT_STATUS
VARCHAR2(19)
LITERAL_HASH_VALUE
NUMBER
LAST_LOAD_TIME
VARCHAR2(19)
IS_OBSOLETE
VARCHAR2(1)
CHILD_LATCH
NUMBER
SQL_PROFILE
VARCHAR2(64)
PROGRAM_ID
NUMBER
PROGRAM_LINE#
NUMBER
EXACT_MATCHING_SIGNATURE
NUMBER
FORCE_MATCHING_SIGNATURE
NUMBER
LAST_ACTIVE_TIME
DATE
BIND_DATA
RAW(2000)
SQL_TEXT
VARCHAR2(1000)
SQL_FULLTEXT
CLOB
SQL_ID
VARCHAR2(13)
SHARABLE_MEM
NUMBER
PERSISTENT_MEM
NUMBER
RUNTIME_MEM
NUMBER
SORTS
NUMBER
LOADED_VERSIONS
NUMBER
OPEN_VERSIONS
NUMBER
USERS_OPENING
NUMBER
FETCHES
NUMBER
EXECUTIONS
NUMBER
PX_SERVERS_EXECUTIONS
NUMBER
END_OF_FETCH_COUNT
NUMBER
USERS_EXECUTING
NUMBER
LOADS
NUMBER
FIRST_LOAD_TIME
VARCHAR2(19)
INVALIDATIONS
NUMBER
PARSE_CALLS
NUMBER
DISK_READS
NUMBER
DIRECT_WRITES
NUMBER
BUFFER_GETS
NUMBER
APPLICATION_WAIT_TIME
NUMBER
CONCURRENCY_WAIT_TIME
NUMBER
CLUSTER_WAIT_TIME
NUMBER
USER_IO_WAIT_TIME
NUMBER
PLSQL_EXEC_TIME
NUMBER
JAVA_EXEC_TIME
NUMBER
ROWS_PROCESSED
NUMBER
COMMAND_TYPE
NUMBER
OPTIMIZER_MODE
VARCHAR2(10)
OPTIMZER_COST
NUMBER
OPTIMZER_ENV
RAW(797)
OPTIMZER_ENV_HASH_VALUE
NUMBER
PARSING_USER_ID
NUMBER
PARSING_SCHEMA_ID
NUMBER
PARSING_SCHEMA_NAME
VARCHAR2(30)
KEPT_VERSIONS
NUMBER
ADDRESS
RAW(4)
TYPE_CHK_HEAP
RAW(4)
HASH_VALUE
NUMBER
OLD_HASH_VALUE
NUMBER
PLAN_HASH_VALUE
NUMBER
CHILD_NUMBER
NUMBER
SERVICE
VARCHAR2(64)
SERVICE_HASH
NUMBER
MODULE
VARCHAR2(64)
MODULE_HASH
NUMBER
ACTION
VARCHAR2(64)
ACTION_HASH
NUMBER
SERIALIZABLE_ABORTS
NUMBER
OUTLINE_CATEGORY
VARCHAR2(64)
CPU_TIME
NUMBER
ELAPSED_TIME
NUMBER
OUTLINE_SID
NUMBER
CHILD_ADDRESS
RAW(4)
SQLTYPE
NUMBER
REMOTE
VARCHAR2(1)
OBJECT_STATUS
VARCHAR2(19)
LITERAL_HASH_VALUE
NUMBER
LAST_LOAD_TIME
VARCHAR2(19)
IS_OBSOLETE
VARCHAR2(1)
CHILD_LATCH
NUMBER
SQL_PROFILE
VARCHAR2(64)
PROGRAM_ID
NUMBER
PROGRAM_LINE#
NUMBER
EXACT_MATCHING_SIGNATURE
NUMBER
FORCE_MATCHING_SIGNATURE
NUMBER
LAST_ACTIVE_TIME
DATE
BIND_DATA
RAW(2000)
Both parent and child cursors have sub heap 0
In addition child cursors have sub heap 6 (execution plan)
Heap #
Description
0
Object
1
Source
2
DIANA
3
PCODE
4
MCODE
5
Errors
6
Parent
Child
Parent
Child
Parent
Child
Parent
Child
SELECT COUNT(*) FROM t1;
select count(*) from T1;
SELECT COUNT(*)
FROM t1;
Some Oracle tools perform limited formatting to standardize SQL statements e.g. SQL*Plus and PL/SQL
© 2006 Julian Dyke
Specified using CURSOR_SHARING parameter
Can be
EXACT (default)
© 2006 Julian Dyke
SELECT c2 FROM t1 WHERE c1 = 0;
SELECT c2 FROM t1 WHERE c1 = 1;
SELECT address, child_address, sql_text FROM v$sql
WHERE sql_text LIKE 'SELECT c2 FROM t1%';
ADDRESS
CHILD_ADDRESS
STATEMENT
6BA7F7F8
6B9B6BE4
6B8FB104
6BB158F0
Parent
6BA7F7F8
Child
6B9B6BE4
Parent
6B8FB104
Child
6BB158F0
SELECT c2 FROM t1 WHERE c1 = 0;
SELECT c2 FROM t1 WHERE c1 = 1;
SELECT address, child_address, sql_text FROM v$sql
WHERE sql_text LIKE 'SELECT c2 FROM t1%';
ADDRESS
CHILD_ADDRESS
STATEMENT
6BA93574
6B8D1A84
Parent
6BA93574
Child
6B8D1A84
c3 VARCHAR2(3),c4 VARCHAR2(3));
v_c1 := v_key;
ELSE
END LOOP;
-- Gather statistics
);
SELECT COUNT(*) FROM t1 WHERE c3 = '0';
SELECT COUNT(*) FROM t1 WHERE c3 = '1';
SELECT COUNT(*) FROM t1 WHERE c3 = '2';
SELECT COUNT(*) FROM t1 WHERE c3 = '3';
SELECT sql_text FROM v$sql
ADDRESS
CHILD_ADDRESS
STATEMENT
6BA812EC
6BB34F64
Parent
6BA812EC
Child
6BB34F64
SELECT COUNT(*) FROM t1 WHERE c4 = '0';
SELECT COUNT(*) FROM t1 WHERE c4 = '1';
SELECT COUNT(*) FROM t1 WHERE c4 = '2';
SELECT COUNT(*) FROM t1 WHERE c4 = '3';
SELECT sql_text FROM v$sql
ADDRESS
CHILD_ADDRESS
STATEMENT
6B8A5D54
6BB2D674
67026E34
6702E9A4
67026E34
671B91E0
67026E34
6B95A4A8
Parent
6B8A5D54
Child
6BB2D674
Parent
67026E34
Child
671B91E0
Child
6702E9A4
Child
6B95A4A8
Multiple Child Cursors
Can be created for a number of reasons including differences in:
System / Session parameters
Describes each loaded child cursor
Contains set of boolean values describing why cursors could not be shared
Heap 0 must still exist for child cursor to be reported
Boolean values for first child of each parent will always be false
First child for parent may change over time as earlier children are aged out
Reasons for mismatches not always clear
© 2006 Julian Dyke
To quickly ascertain why cursors are not being shared use:
SELECT TO_CHAR (bitvector,'XXXXXXXXXXXXXXXX'), COUNT(*) FROM x$kkscs
GROUP BY TO_CHAR (bitvector,'XXXXXXXXXXXXXXXX')
FROM dba_tab_columns
To list the hexadecimal values for each Boolean column use:
© 2006 Julian Dyke
As USER1 set optimizer mode to CHOOSE (default)
ALTER SESSION SET optimizer_mode = CHOOSE;
SELECT COUNT(*) FROM t1;
WHERE sql_text LIKE 'SELECT COUNT(*) FROM t1%';
ALTER SESSION SET optimizer_mode = ALL_ROWS;
SELECT COUNT(*) FROM t1;
ADDRESS
CHILD_ADDRESS
STATEMENT
6B97E3C0
6BA0FC18
V$SYS_OPTIMIZER_ENV - Instance level
V$SES_OPTIMIZER_ENV - Session level
V$SQL_OPTIMIZER_ENV - Statement level
active_instance_count
parallel_execution_enabled
bitmap_merge_area_size
parallel_query_mode
cpu_count
parallel_threads_per_cpu
cursor_sharing
pga_aggregate_target
hash_area_size
query_rewrite_enabled
optimizer_dynamic_sampling
query_rewrite_integrity
optimizer_features_enable
skip_unusable_indexes
optimizer_index_caching
sort_area_retained_size
optimizer_index_cost_adj
sort_area_size
optimizer_mode
star_transformation_enabled
optimizer_secure_view_merging
statistics_level
parallel_ddl_mode
workarea_size_policy
parallel_dml_mode
SELECT COUNT(*) FROM t1;
WHERE sql_text LIKE 'SELECT COUNT(*) FROM t1%';
ALTER SESSION SET optimizer_index_caching = 20;
SELECT COUNT(*) FROM t1;
SELECT COUNT(*) FROM t1;
Optimizer environment parameter views are based on fixed table views
V$SYS_OPTIMIZER_ENV X$QKSCESYS
V$SES_OPTIMIZER_ENV X$QKSCESES
V$SQL_OPTIMIZER_ENV X$KQLFSQCE
25 supported parameters reported in both V$ and X$ views
8 supported parameters only reported in X$ views
151 unsupported parameters only reported in X$ views
To list unsupported optimizer parameters use:
SELECT pname_qkscesyrow FROM x$qkscesys
WHERE SUBSTR (pname_qkscesyrow,1,1) = '_'
ORDER BY 1;
The query at the bottom of this slide was originally incorrect. It has now been amended. Thanks to Pai Vinay for pointing out the error.
© 2006 Julian Dyke
ALTER SESSION SET "_unnest_subquery" = TRUE;
SELECT COUNT(*) FROM t1;
WHERE sql_text LIKE 'SELECT COUNT(*) FROM t1%';
ALTER SESSION SET "_unnest_subquery" = FALSE;
SELECT COUNT(*) FROM t1;
For example
EXECUTE DBMS_MONITOR.SESSION_TRACE_ENABLE;
WHERE sql_text LIKE 'SELECT COUNT(*) FROM t1%';
SELECT COUNT(*) FROM t1;
SELECT COUNT(*) FROM t1;
SELECT COUNT(*) FROM t1;
FALSE
TRUE
Parent
6B97E3C0
One additional child cursor is created for each parent when trace is enabled.
Can be enabled using
event 10046, levels 1,4,8,12
CHILD_NUMBER
0
1
CHILD_ADDRESS
6B99348C
6B895F5C
STATS_ROW_MISMATCH
N
Y
Child
6B99348C
Child
6B895F5C
juliandyke.com
Translations
If a statement references different objects with the same name then multiple child cursors can be generated
For example:
USER2
The statement SELECT c1 FROM t1 will have a shared parent cursor, but multiple child cursors
Parent
Cursor
Child
SELECT c1 FROM t1;
SELECT c1 FROM t1;
ADDRESS
HASH_VALUE
CHILD_NUMBER
CHILD_ADDRESS
6B8E5AEC
3805054639
0
6B8B6C30
6B8E5AEC
3805054639
1
6B8DA100
For example (in SQL*Plus):
CREATE TABLE t1 (c1 VARCHAR2(50),c2 NUMBER);
VARIABLE v1 VARCHAR2(30);
VARIABLE v1 VARCHAR2(40);
SELECT address,hash_value,child_number,child_address
FROM v$sql
ADDRESS
HASH_VALUE
CHILD_NUMBER
CHILD_ADDRESS
6B9B6F74
357538776
0
6B91CA58
6B9B6F74
357538776
1
6BA1DB48
Based on X$KKSBV
Note, in this case ADDRESS is the address of the child cursor
ADDRESS
RAW(4)
POSITION
NUMBER
DATATYPE
NUMBER
MAX_LENGTH
NUMBER
ARRAY_LEN
NUMBER
BIND_NAME
VARCHAR2(30)
SELECT
address,
position,
data_type,
max_length,
bind_name
Multiple child cursors can be caused by bind variable lengths
By default:
VARCHAR2 is rounded to next highest length which can be
32
128
2000
4000
enabling event 10503
ALTER SESSION SET EVENTS
© 2006 Julian Dyke
Bind Variables
For example, by default the following sessions will all generate different child cursors:
VAR b1 VARCHAR2(30)
VAR b2 VARCHAR2(30)
Bind Variables
On the other hand the following statements will all use the same child cursor:
VAR b1 VARCHAR2(40)
VAR b2 VARCHAR2(40)
Internationalization affects child cursors
Only a subset of SQL statements are affected including statements using:
Dates
Currency
Ordering
SELECT address,hash_value,child_number,child_address
FROM v$sql
SELECT TO_CHAR (TO_DATE (:b1,'DD-MON-YYYY'),'yyyymmdd')
SELECT TO_CHAR (TO_DATE (:b1,'DD-MON-YYYY'),'yyyymmdd')
ALTER SESSION SET NLS_LANGUAGE = 'AMERICAN';
SELECT address,hash_value,child_number,child_address
FROM v$sql
WHERE sql_text LIKE 'SELECT c1 FROM t1 ORDER BY t2%';
SELECT c1 FROM t1 ORDER BY c2;
ALTER SESSION SET NLS_LANGUAGE = 'GERMAN';
SELECT c1 FROM t1 ORDER BY c2;
ADDRESS
HASH_VALUE
CHILD_NUMBER
CHILD_ADDRESS
6BA0358C
245919138
0
6BA09B74
6BA0358C
245919138
1
6B9D4560
As USER1
As USER2
ADDRESS
HASH_VALUE
CHILD_NUMBER
CHILD_ADDRESS
6B96CB1C
2856096030
0
6B8959AC
Created in library cache
Does not use any subheaps
If USER2 subsequently creates object called T1 then the virtual object is used to identify statements which should be invalidated
OWNER
NAMESPACE
TYPE
SHARABLE_MEM
PUBLIC
TABLE/PROCEDURE
SYNONYM
345
USER1
TABLE/PROCEDURE
TABLE
343
USER2
TABLE/PROCEDURE
Public Synonyms
Each user requires one additional library cache object for each public synonym referenced
Parent
6B96CB1C
Synonym
PUBLIC.T1
Table
USER2.N1
Although table USER2.T1 is not loaded, memory is still required for the handle, object and name structures
If USER3.T1 executes the same statement, an additional library cache object will be created
Table
USER3.N1
SELECT COUNT (*)
FROM USER1.t1;
Specify minimum size (in kilobytes)
For example to list all objects with size > 64KB use:
SET SERVEROUTPUT ON
EXECUTE dbms_shared_pool.sizes (64);
SIZE(K) KEPT NAME
(6B8551B8,593239587) (CURSOR)
Specify size of 0 to return sizes of all objects in shared pool
© 2006 Julian Dyke
juliandyke.com
DBMS_SHARED_POOL
Fragmentation of the shared pool can be reduced by specifying that objects should be kept.
Kept objects are not subject to aging out of the shared pool
EXECUTE dbms_shared_pool.keep ('<owner>,<object_name>','<type>');
where <type> can be
Any other value for <type> specifies a cursor
Other object types including tables and views cannot be kept in Oracle 10.2 or below
EXECUTE dbms_shared_pool.keep ('SYS.STANDARD','P');
© 2006 Julian Dyke
juliandyke.com
DBMS_SHARED_POOL
To keep a cursor, first obtain the address of the parent cursor and the hash value
V$SQL.ADDRESS (hexadecimal)
V$SQL.HASH_VALUE (decimal)
For example:
EXECUTE dbms_shared_pool.keep ('6B8551B8,593239587','C');
To discontinue keeping an object use UNKEEP procedure with the same parameters e.g.:
EXECUTE dbms_shared_pool.unkeep ('6B8551B8,593239587','C');
EXECUTE dbms_shared_pool.unkeep ('SYS.STANDARD','P');
© 2006 Julian Dyke
ALTER SYSTEM FLUSH SHARED_POOL;
© 2006 Julian Dyke
Avoid unnecessary DDL statements in application
To avoid library cache reloads
Increase size of shared pool
Avoid multiple parent cursors
Optimizer mismatches
Parameter mismatches
Translation mismatches