Library Cache Internals
Library Cache Internals
juliandyke.com
Agenda
juliandyke.com
Shared Pool
Permanent - Static structures - allocated at startup Session arrays Process arrays Segmented arrays Other static structures Heap - Dynamic structures - allocated at runtime Library Cache Dictionary (Row) Cache
juliandyke.com
Determines amount of memory allocated to library cache In Oracle 10.2 and above specified as follows
-- If Automatic Memory Management IF SGA_TARGET specified THEN IF SHARED_POOL_SIZE specified THEN minimum size of shared pool = SHARED_POOL_SIZE ELSE size of shared pool determined automatically ELSE -- Manual memory management IF SHARED_POOL_SIZE specified THEN size of shared pool = SHARED_POOL_SIZE ELSE IF 32-bit platform size = 32M IF 64-bit platform size = 84M
4
juliandyke.com
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 Java classes
juliandyke.com
Object Types
Every object in the library cache has an object type. Object types include:
Cursor Table Index Cluster View Synonym Sequence Procedure Function Package Package Trigger Type Type Index-Organized Java
Table
Body
Body Object User Database Link Pipe Table Partition Index Partition LOB Library Directory Queue
Source Java Class Java Resource Java JAR Table Subpartition Index Subpartition LOB Partition LOB Subpartition Summary Dimension Stored Outline
juliandyke.com
Namespaces
Context Stored Outline Ruleset Resource Plan Resource Consumer Group Subscription Location Remote Object Snapshot Metadata Java Shared Data Security Profile
juliandyke.com
V$DB_OBJECT_CACHE
VARCHAR2(64)
VARCHAR2(1000) VARCHAR2(64) VARCHAR2(28) VARCHAR2(28) NUMBER NUMBER
EXECUTIONS
LOCKS PINS KEPT CHILD_LATCH INVALIDATIONS
NUMBER
NUMBER NUMBER VARCHAR2(3) NUMBER NUMBER
Based on X$KGLOB
juliandyke.com
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
juliandyke.com
SQL Statements
Each SQL statement has Parent cursor One or more child cursors
Parent
Child 0
Child 1
Child 2
Child 3
10
juliandyke.com
Parent Cursor
One parent cursor for each textually different SQL statement in library cache
11
juliandyke.com
Parent Cursor
KGLHD
KGLOB
KGLNA
KGLNA KGLNA
SELECT c1, c2,c3,c4,c5, c6,c7,c8,c9, c10 FROM t1,t2, t3,t4,t5 WHERE t1.c1=t2.c1..
12
juliandyke.com
V$SQLAREA
SQL_TEXT SQL_FULLTEXT SQL_ID SHARABLE_MEM PERSISTENT_MEM RUNTIME_MEM SORTS VERSION_COUNT LOADED_VERSIONS OPEN_VERSIONS USERS_OPENING FETCHES EXECUTIONS PX_SERVERS_EXECUTIONS END_OF_FETCH_COUNT USERS_EXECUTING LOADS FIRST_LOAD_TIME INVALIDATIONS PARSE_CALLS DISK_READS DIRECT_WRITES
13
juliandyke.com
Child Cursors
Each parent cursor can have one or more child cursors Child cursor contains Environment Statistics Execution Plan Contains KGLHD - Handle structure KGLOB - Object structure Subheaps
Externalised by V$SQL X$KGLOB (WHERE kglhdpar != kglhdadr) X$KGLCURSOR_CHILD (in Oracle 10.2 and above)
14
juliandyke.com
Child Cursors
KGLHD KGLOB KGLNA Parent Cursor
KGLHD
KGLHD
KGLHD
KGLHD
KGLHD
KGLHD
15
juliandyke.com
Child Cursors
KGLHD
Child Cursor
KGLOB
Heap 0
Heap 6
Environment
Statistics
Bind Variables
Execution Plan
16
juliandyke.com
V$SQL
SQL_TEXT SQL_FULLTEXT SQL_ID SHARABLE_MEM PERSISTENT_MEM RUNTIME_MEM SORTS LOADED_VERSIONS OPEN_VERSIONS USERS_OPENING FETCHES
PLSQL_EXEC_TIME
JAVA_EXEC_TIME ROWS_PROCESSED COMMAND_TYPE
NUMBER
NUMBER NUMBER NUMBER
OPTIMIZER_MODE
OPTIMZER_COST OPTIMZER_ENV OPTIMZER_ENV_HASH_VALUE
VARCHAR2(10)
NUMBER RAW(797) NUMBER
PARSING_USER_ID
PARSING_SCHEMA_ID PARSING_SCHEMA_NAME KEPT_VERSIONS
NUMBER
NUMBER VARCHAR2(30) NUMBER
EXECUTIONS
PX_SERVERS_EXECUTIONS END_OF_FETCH_COUNT
NUMBER
NUMBER NUMBER
USERS_EXECUTING
LOADS FIRST_LOAD_TIME
NUMBER
NUMBER VARCHAR2(19)
ADDRESS
TYPE_CHK_HEAP HASH_VALUE OLD_HASH_VALUE
RAW(4)
RAW(4) NUMBER NUMBER
INVALIDATIONS
PARSE_CALLS DISK_READS DIRECT_WRITES BUFFER_GETS APPLICATION_WAIT_TIME CONCURRENCY_WAIT_TIME
NUMBER
NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER
PLAN_HASH_VALUE
CHILD_NUMBER SERVICE SERVICE_HASH
NUMBER
NUMBER VARCHAR2(64) NUMBER
MODULE
VARCHAR2(64)
17
juliandyke.com
Object Heaps
6
7 8 9 10 11
18
SQL Context
Free Subordinate Heap Subordinate Heap Subordinate Heap Subordinate Heap
Both parent and child cursors have sub heap 0 In addition child cursors have sub heap 6 (execution plan)
juliandyke.com
Parent
Parent
Parent
Parent
Child
Child
Child
Child
19
juliandyke.com
Created because of differences in SQL statement text The following statements all require separate parent cursors:
SELECT COUNT(*) FROM t1;
Some Oracle tools perform limited formatting to standardize SQL statements e.g. SQL*Plus and PL/SQL
20
juliandyke.com
Cursor Sharing
Introduced in Oracle 8.1.6 Replaces literals in SQL statements with variables Increases probability that parent cursors are shared Specified using CURSOR_SHARING parameter Can be specified at SYSTEM or SESSION level Can be EXACT (default) FORCE SIMILAR (Oracle 9.0.1 and above)
21
juliandyke.com
Parent
6BA7F7F8
Parent
6B8FB104
Child
6B9B6BE4
Child
6BB158F0
22
juliandyke.com
Parent
6BA93574
Child
6B8D1A84
23
juliandyke.com
Example
CREATE TABLE t1 (c1 NUMBER,c2 VARCHAR2(10), c3 VARCHAR2(3),c4 VARCHAR2(3)); DECLARE v_c1 t1.c1%TYPE; v_c2 t1.c2%TYPE; v_c3 t1.c3%TYPE; v_c4 t1.c4%TYPE; BEGIN FOR v_key IN 1..10000 LOOP v_c1 := v_key; v_c2 := LPAD (TO_CHAR (v_key),10,'0'); IF v_key < 100 THEN v_c3 := TO_CHAR (TRUNC (v_key / 10) + 1); ELSE v_c3 := TO_CHAR (0); END IF; v_c4 := v_c3; INSERT INTO t1 VALUES (v_c1,v_c2,v_c3,v_c4); END LOOP; COMMIT; END; /
24
juliandyke.com
Example
-- Create a non-unique index on c3 CREATE INDEX t1_i1 ON t1 (c3); -- Create a non-unique index on c4 CREATE INDEX t1_i2 ON t1 (c4); -- Gather statistics BEGIN DBMS_STATS.GATHER_TABLE_STATS ( ownname => 'US01', tabname => 'T1', estimate_percent => NULL, method_opt => 'FOR COLUMNS SIZE 4 c4' ); END; / ALTER SYSTEM FLUSH SHARED_POOL;
25
juliandyke.com
ADDRESS 6BA812EC
CHILD_ADDRESS 6BB34F64
Parent
6BA812EC
Child
6BB34F64
26
juliandyke.com
6B8A5D54
67026E34 67026E34 67026E34
6BB2D674
6702E9A4 671B91E0 6B95A4A8
Parent
6B8A5D54
Parent
67026E34
Child
6BB2D674 27
Child
6702E9A4
Child
671B91E0
Child
6B95A4A8
juliandyke.com
Can be created for a number of reasons including differences in: System / Session parameters Object translation Bind variables NLS parameters
28
juliandyke.com
V$SQL_SHARED_CURSOR
SQL_ID
ADDRESS
VARCHAR2(13)
RAW(4)
DESCRIBE_MISMATCH
LANGUAGE_MISMATCH
VARCHAR2(1)
VARCHAR2(1)
DIFFERENT_LONG_LENGTH
LOGICAL_STANDBY_APPLY DIFF_CALL_DURN BIND_UACS_DIFF PLSQL_CMP_SWITCHS_DIFF CURSOR_PARTS_MISMATCH STB_OBJECT_MISMATCH ROW_SHIP_MISMATCH PQ_SLAVE_MISMATCH TOP_LEVEL_DDL_MISMATCH MULTI_PX_MISMATCH
VARCHAR2(1)
VARCHAR2(1) VARCHAR2(1) VARCHAR2(1) VARCHAR2(1) VARCHAR2(1) VARCHAR2(1) VARCHAR2(1) VARCHAR2(1) VARCHAR2(1) VARCHAR2(1)
CHILD_ADDRESS
CHILD_NUMBER UNBOUND_CURSOR SQL_TYPE_MISMATCH OPTIMIZER_MISMATCH OUTLINE_MISMATCH STATS_ROW_MISMATCH LITERAL_MISMATCH SEC_DEPTH_MISMATCH EXPLAIN_PLAN_MISMATCH
RAW(4)
NUMBER VARCHAR2(1) VARCHAR2(1) VARCHAR2(1) VARCHAR2(1) VARCHAR2(1) VARCHAR2(1) VARCHAR2(1) VARCHAR2(1)
TRANSLATION_MISMATCH
ROW_LEVEL_SEC_MISMATCH INSUFF_PRIVS INSUFF_PRIVS_REM REMOTE_TRANS_MISMATCH LOGMINER_SESSION_MISMATCH INCOMP_LTRL_MISMATCH OVERLAP_TIME_MISMATCH SQL_REDIRECT_MISMATCH MV_QUERY_GEN_MISMATCH USER_BIND_PEEK_MISMATCH TYPCHK_DEP_MISMATCH NO_TRIGGER_MISMATCH FLASHBACK_CURSOR ANYDATA_TRANSFORMATION INCOMPLETE_CURSOR TOP_LEVEL_RPI_CURSOR
VARCHAR2(1)
VARCHAR2(1) VARCHAR2(1) VARCHAR2(1) VARCHAR2(1) VARCHAR2(1) VARCHAR2(1) VARCHAR2(1) VARCHAR2(1) VARCHAR2(1) VARCHAR2(1) VARCHAR2(1) VARCHAR2(1) VARCHAR2(1) VARCHAR2(1) VARCHAR2(1) VARCHAR2(1)
BIND_PEEKED_PQ_MISMATCH
MV_REWRITE_MISMATCH ROLL_INVALID_MISMATCH OPTIMIZER_MODE_MISMATCH PX_MISMATCH MV_STALEOBJ_MISMATCH FLASHBACK_TABLE_MISMATCH LITREP_COMP_MISMATCH
VARCHAR2(1)
VARCHAR2(1) VARCHAR2(1) VARCHAR2(1) VARCHAR2(1) VARCHAR2(1) VARCHAR2(1) VARCHAR2(1)
BUFFERED_DML_MISMATCH
PDML_ENV_MISMATCH INST_DRTLD_MISMATCH SLAVE_QC_MISMATCH TYPECHECK_MISMATCH AUTH_CHECK_MISMATCH BIND_MISMATCH
VARCHAR2(1)
VARCHAR2(1) VARCHAR2(1) VARCHAR2(1) VARCHAR2(1) VARCHAR2(1) VARCHAR2(1)
29
juliandyke.com
V$SQL_SHARED_CURSOR
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
30
juliandyke.com
V$SQL_SHARED_CURSOR
Based on X$KKSCS 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') ORDER BY 1;
31
juliandyke.com
Optimizer Mode
Different optimizer modes require separate child cursors As USER1 set optimizer mode to CHOOSE (default)
ALTER SESSION SET optimizer_mode = CHOOSE; SELECT COUNT(*) FROM t1;
SELECT address, child_address, sql_text FROM v$sql WHERE sql_text LIKE 'SELECT COUNT(*) FROM t1%'; ADDRESS 6B97E3C0 6B97E3C0 CHILD_ADDRESS 6BA0FC18 6BAE9904 STATEMENT SELECT COUNT(*) FROM t1; SELECT COUNT(*) FROM t1;
32
juliandyke.com
Optimizer Mode
As SYSDBA
SELECT child_number, child_address, optimizer_mode_mismatch FROM v$sql_shared_cursor WHERE address = ' 6B97E3C0' CHILD_NUMBER CHILD_ADDRESS OPTIMIZER_MODE_MISMATCH 0 6BA0FC18 N 1 6BAE9904 Y
Parent
6B97E3C0
optimizer_mode = CHOOSE
Child
6B9B6BE4
Child
6BB158F0
optimizer_mode = ALL_ROWS
33
juliandyke.com
Optimizer Parameters
Optimizer parameters are specified in V$SYS_OPTIMIZER_ENV - Instance level V$SES_OPTIMIZER_ENV - Session level V$SQL_OPTIMIZER_ENV - Statement level In Oracle 10.2 there are 25 supported optimizer parameters
active_instance_count bitmap_merge_area_size cpu_count cursor_sharing hash_area_size optimizer_dynamic_sampling optimizer_features_enable optimizer_index_caching optimizer_index_cost_adj optimizer_mode optimizer_secure_view_merging parallel_ddl_mode parallel_dml_mode parallel_execution_enabled parallel_query_mode parallel_threads_per_cpu pga_aggregate_target query_rewrite_enabled query_rewrite_integrity skip_unusable_indexes sort_area_retained_size sort_area_size star_transformation_enabled statistics_level workarea_size_policy
34
juliandyke.com
35
juliandyke.com
As SYSDBA
SELECT child_number, child_address, optimizer_mismatch FROM v$sql_shared_cursor WHERE address = ' 6B97E3C0' CHILD_NUMBER CHILD_ADDRESS 0 6BA937EC 1 6B855EB4 2 6BB1DE24
OPTIMIZER_MISMATCH
Parent
6B97E3C0
Child
6BA937EC optimizer_index_caching 36 0
Child
6B855EB4 20
Child
6BB1DE24 40
juliandyke.com
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 In Oracle 10.2 there are 184 optimizer parameters 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
37
juliandyke.com
SELECT address, child_address, sql_text FROM v$sql WHERE sql_text LIKE 'SELECT COUNT(*) FROM t1%'; ADDRESS 6B97E3C0 6B97E3C0 CHILD_ADDRESS 6B879828 6B976F20 STATEMENT SELECT COUNT(*) FROM t1; SELECT COUNT(*) FROM t1;
38
juliandyke.com
As SYSDBA
SELECT child_number, child_address, optimizer_mismatch FROM v$sql_shared_cursor WHERE address = ' 6B97E3C0' CHILD_NUMBER CHILD_ADDRESS 0 6B879828 1 6B976F20
OPTIMIZER_MISMATCH
Parent
6B97E3C0
Child
6B879828 _unnest_subquery 39 TRUE
Child
6B976F20 FALSE
juliandyke.com
Trace
40
juliandyke.com
Trace
SELECT child_number, child_address, stats_row_mismatch FROM v$sql_shared_cursor WHERE address = ' 6B97E27C' CHILD_NUMBER CHILD_ADDRESS STATS_ROW_MISMATCH 0 6B99348C N 1 6B895F5C Y
One additional child cursor is created for each parent when trace is enabled. Can be enabled using event 10046, levels 1,4,8,12 sql_trace parameter or DBMS_MONITOR package
Trace Enabled
Parent
6B97E3C0
Child
6B99348C FALSE
Child
6B895F5C TRUE
41
juliandyke.com
Translations
If a statement references different objects with the same name then multiple child cursors can be generated For example:
USER1
CREATE TABLE t1 (c1 NUMBER); SELECT c1 FROM t1;
USER2
CREATE TABLE t1 (c1 NUMBER); SELECT c1 FROM t1;
The statement SELECT c1 FROM t1 will have a shared parent cursor, but multiple child cursors
Parent Cursor
Child Cursor 1
42
USER1.T1
USER2.T1 juliandyke.com
Translations
As USER1
CREATE TABLE t1 (c1 NUMBER); SELECT c1 FROM t1;
As USER2
CREATE TABLE t1 (c1 NUMBER); SELECT c1 FROM t1;
As SYSDBA
SELECT address,hash_value,child_number,child_address FROM v$sql WHERE sql_text LIKE 'SELECT c1 FROM t1%'; ADDRESS HASH_VALUE CHILD_NUMBER CHILD_ADDRESS
6B8E5AEC
6B8E5AEC
3805054639
3805054639
0
1
6B8B6C30
6B8DA100
43
juliandyke.com
Translations
SELECT child_number, child_address, auth_check_mismatch, translation_mismatch FROM v$sql_shared_cursor WHERE address = ' 6B8E5AEC'
CHILD_NUMBER CHILD_ADDRESS 0 6B8B6C30 1 6B8DA100
AUTH_CHECK_MISMATCH
TRANSLATION_MISMATCH Parent
6B9B7F74
N
N
Y
Y
Child
6B91CA58 44
Child
6BA1DB48 USER2
USER1
juliandyke.com
Translations
SELECT kgltrorg, kgltrfnl FROM x$kgltr WHERE kglhdadr = '6B8B6C30'; KGLTRORG 6BA68DAC KGLTRFNL 6BA68DAC
SELECT kglnaown kglnaobj FROM x$kglob WHERE kglhdadr = '6BA68DAC'; KGLNAOWN USER1 KGLNAOBJ T1
SELECT kglnaown kglnaobj FROM x$kglob WHERE kglhdadr = '6B8F9220'; KGLNAOWN USER2 KGLNAOBJ T1
45
juliandyke.com
Bind Variables
Length of bind variables affects number of child cursors For example (in SQL*Plus):
CREATE TABLE t1 (c1 VARCHAR2(50),c2 NUMBER); VARIABLE v1 VARCHAR2(30); SELECT c2 FROM t1 WHERE c1 = :v1; VARIABLE v1 VARCHAR2(40); SELECT c2 FROM t1 WHERE c1 = :v1; SELECT address,hash_value,child_number,child_address FROM v$sql WHERE sql_text LIKE 'SELECT c2 FROM t1 WHERE c1 = %'; ADDRESS 6B9B6F74 6B9B6F74 HASH_VALUE CHILD_NUMBER 357538776 357538776 0 1 CHILD_ADDRESS 6B91CA58 6BA1DB48
46
juliandyke.com
Bind Variables
SELECT child_number, child_address, bind_mismatch FROM v$sql_shared_cursor WHERE address = ' 6B9B7F74'
CHILD_NUMBER
CHILD_ADDRESS BIND_MISMATCH Parent
6B9B7F74
0
N
1
Y
6B91CA58 6BA1DB48
Child
6B91CA58 VARCHAR2(30) 47
Child
6BA1DB48 VARCHAR2(40)
juliandyke.com
V$SQL_BIND_METADATA
Based on X$KKSBV Note, in this case ADDRESS is the address of the child cursor
48
juliandyke.com
Bind Variables
POSITION 1 1
DATATYPE 1 1
MAX_LENGTH 32 128
BIND_NAME V1 V1
49
juliandyke.com
Bind Variables
Multiple child cursors can be caused by bind variable lengths By default: NUMBER is 22 bytes VARCHAR2 is rounded to next highest length which can be 32 128 2000 4000 Rounding of VARCHAR2 columns can be overridden by enabling event 10503 setting level to minimum bind variable length e.g. 128
ALTER SESSION SET EVENTS '10503 TRACE NAME CONTEXT FOREVER, LEVEL 128';
50
juliandyke.com
Bind Variables
For example, by default the following sessions will all generate different child cursors:
VAR b1 VARCHAR2(30)
VAR b2 VARCHAR2(30) SELECT c1 FROM t1 WHERE :b1 = 100 AND :b2 = 200; VAR b1 VARCHAR2(30)
VAR b2 VARCHAR2(60)
SELECT c1 FROM t1 WHERE :b1 = 100 AND :b2 = 200;
VAR b1 VARCHAR2(60) VAR b2 VARCHAR2(30) SELECT c1 FROM t1 WHERE :b1 = 100 AND :b2 = 200;
VAR b1 VARCHAR2(60) VAR b2 VARCHAR2(60) SELECT c1 FROM t1 WHERE :b1 = 100 AND :b2 = 200;
51
juliandyke.com
Bind Variables
On the other hand the following statements will all use the same child cursor:
VAR b1 VARCHAR2(40)
VAR b2 VARCHAR2(40) SELECT c1 FROM t1 WHERE :b1 = 100 AND :b2 = 200; VAR b1 VARCHAR2(40)
VAR b2 VARCHAR2(60)
SELECT c1 FROM t1 WHERE :b1 = 100 AND :b2 = 200;
VAR b1 VARCHAR2(60) VAR b2 VARCHAR2(40) SELECT c1 FROM t1 WHERE :b1 = 100 AND :b2 = 200;
VAR b1 VARCHAR2(60) VAR b2 VARCHAR2(60) SELECT c1 FROM t1 WHERE :b1 = 100 AND :b2 = 200;
52
juliandyke.com
Internationalization
Internationalization affects child cursors Only a subset of SQL statements are affected including statements using: Dates Currency Ordering
53
juliandyke.com
Internationalization
Example 1 - Dates
VAR b1 VARCHAR(30); EXECUTE b1 := SYSDATE; ALTER SESSION SET NLS_LANGUAGE = 'AMERICAN';
ADDRESS
6B94EA84 6B94EA84
54
HASH_VALUE
659654739 659654739
CHILD_NUMBER
0 1
CHILD_ADDRESS
6BA268F0 6B8E3B20
juliandyke.com
Internationalization
SELECT child_number, child_address, language_mismatch FROM v$sql_shared_cursor WHERE address = ' 6B94EA84'
0 6BA268F0 N
1 6B8E3B20 Y
Child
6BA268F0 AMERICAN 55
Child
6B8E3B20 GERMAN
juliandyke.com
Internationalization
Example 2 - Ordering
CREATE TABLE t1 (c1 NUMBER, c2 VARCHAR2(1));
ALTER SESSION SET NLS_LANGUAGE = 'AMERICAN';
juliandyke.com
Internationalization
SELECT child_number, child_address, language_mismatch FROM v$sql_shared_cursor WHERE address = ' 6BA0358C' CHILD_NUMBER
CHILD_ADDRESS LANGUAGE_MISMATCH
0
6BA09B74 N
1
6B9D4560 Y
Parent
6BA0358C
Child
6BA09B74
AMERICAN 57
Child
6B9D4560
GERMAN
juliandyke.com
Public Synonyms
As USER2
SELECT COUNT (*) FROM t1;
SELECT address,hash_value,child_number,child_address FROM v$sql WHERE sql_text LIKE 'SELECT COUNT(*) FROM t1%';
ADDRESS 6B96CB1C HASH_VALUE CHILD_NUMBER 2856096030 0 CHILD_ADDRESS 6B8959AC
58
juliandyke.com
Public Synonyms
SELECT owner,namespace,type,sharable_mem FROM v$db_object_cache WHERE name = 'T1'; OWNER PUBLIC USER1 USER2
USER2.T1 is a virtual object Created in library cache Requires KGLHD, KGLOB and KGLNA structures 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
59
juliandyke.com
Public Synonyms
Each user requires one additional library cache object for each public synonym referenced
Parent
6B96CB1C
Child
6B91CA58
Table
USER1.T1
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 Use fully qualified names instead of public synonyms
SELECT COUNT (*) FROM USER1.t1;
Synonym
PUBLIC.T1
Table
USER2.N1
Table
USER3.N1
60
juliandyke.com
DBMS_SHARED_POOL
Reports the largest objects currently in the shared pool 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
61
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 'P','p': Package/procedure/function 'T','t': Type 'R','r': Trigger 'Q','q': Sequence For example
EXECUTE dbms_shared_pool.keep ('SYS.STANDARD','P');
Any other value for <type> specifies a cursor Other object types including tables and views cannot be kept in Oracle 10.2 or below
62
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)
EXECUTE dbms_shared_pool.keep ('<address>,<hash_value>','C');
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 ('SYS.STANDARD','P'); EXECUTE dbms_shared_pool.unkeep ('6B8551B8,593239587','C');
63
juliandyke.com
And Finally...
64
juliandyke.com
Any Questions ?
juliandyke.com
Conclusion
To avoid library cache reloads Increase size of shared pool Avoid multiple parent cursors Standardize SQL Use cursor sharing Avoid multiple child cursors caused by Optimizer mismatches Parameter mismatches Translation mismatches Bind variable mismatches Language mismatches
66
juliandyke.com