Library Cache Internals
Download
Report
Transcript Library Cache Internals
Library Cache
Internals
Julian Dyke
Independent Consultant
Web Version
1
© 2006 Julian Dyke
juliandyke.com
Agenda
2
© 2006 Julian Dyke
Introduction
Multiple Parent Cursors
Multiple Child Cursors
DBMS_SHARED_POOL
Summary
juliandyke.com
Shared Pool
3
Shared pool includes:
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
© 2006 Julian Dyke
juliandyke.com
Shared Pool Size
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
© 2006 Julian Dyke
juliandyke.com
Library Cache
5
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
© 2006 Julian Dyke
juliandyke.com
Object Types
Every object in the library cache has an object type. Object
types include:
Cursor
Type
Index-Organized
Table
Type
Java
Index
Cluster
View
Synonym
Sequence
Procedure
Function
Package
Package
Body
Trigger
6
© 2006 Julian Dyke
Body
Object
User
Database Link
Pipe
Table Partition
Index Partition
LOB
Library
Directory
Queue
Table
Source
Java Class
Java Resource
Java JAR
Table Subpartition
Index Subpartition
LOB Partition
LOB Subpartition
Summary
Dimension
Stored Outline
juliandyke.com
Namespaces
Every object in the library cache belongs to a namespace
Namespaces include:
Cursor
Table/Procedure
Body
Trigger
Index
Cluster
Object
Java
Source
Java Resource
Context Policy
Publish/Subscribe
Dimension
7
© 2006 Julian Dyke
Application
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
8
Reports all objects currently in the library cache
OWNER
VARCHAR2(64)
NAME
VARCHAR2(1000)
DB_LINK
VARCHAR2(64)
NAMESPACE
VARCHAR2(28)
TYPE
VARCHAR2(28)
SHARABLE_MEM
NUMBER
LOADS
NUMBER
EXECUTIONS
NUMBER
LOCKS
NUMBER
PINS
NUMBER
KEPT
VARCHAR2(3)
CHILD_LATCH
NUMBER
INVALIDATIONS
NUMBER
Based on X$KGLOB
© 2006 Julian Dyke
juliandyke.com
Library Cache Dumps
To dump the contents of the library cache use
ALTER SESSION SET EVENTS
'IMMEDIATE TRACE NAME LIBRARY_CACHE LEVEL n';
9
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
juliandyke.com
SQL Statements
Each SQL statement has
Parent cursor
One or more child cursors
Parent
Child 0
10
© 2006 Julian Dyke
Child 1
Child 2
Child 3
juliandyke.com
Parent Cursor
11
One parent cursor for each textually different SQL statement
in library cache
Statements identified by hash value
Generated from statement text
Contains
KGLHD - Handle structure
KGLOB - Object structure
KGLNA - Name structure
Externalised by
V$SQLAREA
X$KGLOB (WHERE kglhdpar = kglhdadr)
© 2006 Julian Dyke
juliandyke.com
Parent Cursor
KGLHD
KGLOB
KGLNA
KGLNA
KGLNA
12
© 2006 Julian Dyke
SELECT c1,
c2,c3,c4,c5,
c6,c7,c8,c9,
c10
FROM t1,t2,
t3,t4,t5
WHERE
t1.c1=t2.c1..
juliandyke.com
V$SQLAREA
13
Contains one row for each parent cursor
SQL_TEXT
VARCHAR2(1000)
BUFFER_GETS
NUMBER
MODULE_HASH
NUMBER
SQL_FULLTEXT
CLOB
APPLICATION_WAIT_TIME
NUMBER
ACTION
VARCHAR2(64)
SQL_ID
VARCHAR2(13)
CONCURRENCY_WAIT_TIME
NUMBER
ACTION_HASH
NUMBER
SHARABLE_MEM
NUMBER
CLUSTER_WAIT_TIME
NUMBER
SERIALIZABLE_ABOUTS
NUMBER
PERSISTENT_MEM
NUMBER
USER_IO_WAIT_TIME
NUMBER
OUTLINE_CATEGORY
VARCHAR2(64)
RUNTIME_MEM
NUMBER
PLSQL_EXEC_TIME
NUMBER
CPU_TIME
NUMBER
SORTS
NUMBER
JAVA_EXEC_TIME
NUMBER
ELAPSED_TIME
NUMBER
VERSION_COUNT
NUMBER
ROWS_PROCESSED
NUMBER
OUTLINE_SID
VARCHAR2(40)
LOADED_VERSIONS
NUMBER
COMMAND_TYPE
NUMBER
LAST_ACTIVE_CHILD_ADDRESS
RAW(4)
OPEN_VERSIONS
NUMBER
OPTIMIZER_MODE
VARCHAR2(10)
REMOTE
VARCHAR2(1)
USERS_OPENING
NUMBER
OPTIMIZER_COST
NUMBER
OBJECT_STATUS
VARCHAR2(19)
FETCHES
NUMBER
OPTIMIZER_ENV
RAW(797)
LITERAL_HASH_VALUE
NUMBER
EXECUTIONS
NUMBER
OPTIMIZER_ENV_HASH_VALUE
NUMBER
LAST_LOAD_TIME
DATE
PX_SERVERS_EXECUTIONS
NUMBER
PARSING_USER_ID
NUMBER
IS_OBSOLETE
VARCHAR2(1)
END_OF_FETCH_COUNT
NUMBER
PARSING_SCHEMA_ID
NUMBER
CHILD_LATCH
NUMBER
USERS_EXECUTING
NUMBER
PARSING_SCHEMA_NAME
VARCHAR2(64)
SQL_PROFILE
VARCHAR2(64)
LOADS
NUMBER
KEPT_VERSIONS
NUMBER
PROGRAM_ID
NUMBER
FIRST_LOAD_TIME
VARCHAR2(19)
ADDRESS
RAW(4)
PROGRAM_LINE#
NUMBER
INVALIDATIONS
NUMBER
HASH_VALUE
NUMBER
EXACT_MATCHING_SIGNATURE
NUMBER
PARSE_CALLS
NUMBER
OLD_HASH_VALUE
NUMBER
FORCE_MATCHING_SIGNATURE
NUMBER
DISK_READS
NUMBER
PLAN_HASH_VALUE
NUMBER
LAST_ACTIVE_TIME
DATE
DIRECT_WRITES
NUMBER
MODULE
VARCHAR2(64)
BIND_DATA
RAW(2000)
© 2006 Julian Dyke
juliandyke.com
Child Cursors
14
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)
© 2006 Julian Dyke
juliandyke.com
Child Cursors
KGLHD
KGLOB
KGLHD
15
KGLHD
© 2006 Julian Dyke
KGLHD
Parent
Cursor
KGLNA
KGLHD
KGLHD
KGLHD
juliandyke.com
Child Cursors
KGLHD
Child
Cursor
KGLOB
Heap 0
Environment
16
© 2006 Julian Dyke
Statistics
Heap 6
Bind
Variables
Execution
Plan
juliandyke.com
V$SQL
Contains one row for each child cursor
SQL_TEXT
17
VARCHAR2(1000)
CLUSTER_WAIT_TIME
NUMBER
MODULE_HASH
NUMBER
VARCHAR2(64)
SQL_FULLTEXT
CLOB
USER_IO_WAIT_TIME
NUMBER
ACTION
SQL_ID
VARCHAR2(13)
PLSQL_EXEC_TIME
NUMBER
ACTION_HASH
NUMBER
SHARABLE_MEM
NUMBER
JAVA_EXEC_TIME
NUMBER
SERIALIZABLE_ABORTS
NUMBER
PERSISTENT_MEM
NUMBER
ROWS_PROCESSED
NUMBER
OUTLINE_CATEGORY
VARCHAR2(64)
RUNTIME_MEM
NUMBER
COMMAND_TYPE
NUMBER
CPU_TIME
NUMBER
SORTS
NUMBER
OPTIMIZER_MODE
VARCHAR2(10)
ELAPSED_TIME
NUMBER
LOADED_VERSIONS
NUMBER
OPTIMZER_COST
NUMBER
OUTLINE_SID
NUMBER
OPEN_VERSIONS
NUMBER
OPTIMZER_ENV
RAW(797)
CHILD_ADDRESS
RAW(4)
USERS_OPENING
NUMBER
OPTIMZER_ENV_HASH_VALUE
NUMBER
SQLTYPE
NUMBER
FETCHES
NUMBER
PARSING_USER_ID
NUMBER
REMOTE
VARCHAR2(1)
EXECUTIONS
NUMBER
PARSING_SCHEMA_ID
NUMBER
OBJECT_STATUS
VARCHAR2(19)
PX_SERVERS_EXECUTIONS
NUMBER
PARSING_SCHEMA_NAME
VARCHAR2(30)
LITERAL_HASH_VALUE
NUMBER
END_OF_FETCH_COUNT
NUMBER
KEPT_VERSIONS
NUMBER
LAST_LOAD_TIME
VARCHAR2(19)
USERS_EXECUTING
NUMBER
ADDRESS
RAW(4)
IS_OBSOLETE
VARCHAR2(1)
LOADS
NUMBER
TYPE_CHK_HEAP
RAW(4)
CHILD_LATCH
NUMBER
FIRST_LOAD_TIME
VARCHAR2(19)
HASH_VALUE
NUMBER
SQL_PROFILE
VARCHAR2(64)
INVALIDATIONS
NUMBER
OLD_HASH_VALUE
NUMBER
PROGRAM_ID
NUMBER
PARSE_CALLS
NUMBER
PLAN_HASH_VALUE
NUMBER
PROGRAM_LINE#
NUMBER
DISK_READS
NUMBER
CHILD_NUMBER
NUMBER
EXACT_MATCHING_SIGNATURE
NUMBER
DIRECT_WRITES
NUMBER
SERVICE
VARCHAR2(64)
FORCE_MATCHING_SIGNATURE
NUMBER
BUFFER_GETS
NUMBER
SERVICE_HASH
NUMBER
LAST_ACTIVE_TIME
DATE
APPLICATION_WAIT_TIME
NUMBER
MODULE
VARCHAR2(64)
BIND_DATA
RAW(2000)
CONCURRENCY_WAIT_TIME
NUMBER
© 2006 Julian Dyke
juliandyke.com
Object Heaps
18
Every object can have optional sub heaps
Heap #
0
1
2
3
4
Description
Object
Source
DIANA
PCODE
MCODE
5
Errors
6
SQL Context
7
Free
8
Subordinate Heap
9
Subordinate Heap
10
Subordinate Heap
11
Subordinate Heap
Both parent and child cursors have sub heap 0
In addition child cursors have sub heap 6 (execution plan)
© 2006 Julian Dyke
juliandyke.com
Multiple Parent Cursors
19
Each parent requires at least one child cursor
Parent
Parent
Parent
Parent
Child
Child
Child
Child
© 2006 Julian Dyke
juliandyke.com
Multiple Parent Cursors
Created because of differences in SQL statement text
The following statements all require separate parent cursors:
SELECT COUNT(*) FROM t1;
select count(*) from T1;
SELECT /* COMMENT */ COUNT(*) FROM t1;
SELECT COUNT(*)
FROM t1;
20
Some Oracle tools perform limited formatting to standardize
SQL statements e.g. SQL*Plus and PL/SQL
© 2006 Julian Dyke
juliandyke.com
Cursor Sharing
21
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)
© 2006 Julian Dyke
juliandyke.com
Cursor Sharing - Exact
Exact cursor sharing (default)
ALTER SESSION SET cursor_sharing = EXACT;
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%';
22
ADDRESS
CHILD_ADDRESS
6BA7F7F8
6B9B6BE4
SELECT c2 FROM t1 WHERE c1 = 0
6B8FB104
6BB158F0
SELECT c2 FROM t1 WHERE c1 = 1
© 2006 Julian Dyke
STATEMENT
Parent
Parent
6BA7F7F8
6B8FB104
Child
Child
6B9B6BE4
6BB158F0
juliandyke.com
Cursor Sharing - Force
Forced cursor sharing
ALTER SESSION SET cursor_sharing = FORCE;
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
SELECT c2 FROM t1 WHERE c1 = :"SYS_B_0"
Parent
6BA93574
Child
6B8D1A84
23
© 2006 Julian Dyke
juliandyke.com
Cursor Sharing - Similar
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
© 2006 Julian Dyke
juliandyke.com
Cursor Sharing - Similar
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
© 2006 Julian Dyke
juliandyke.com
Cursor Sharing - Similar
Example - column without histogram
ALTER SYSTEM SET cursor_sharing = SIMILAR;
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
WHERE sql_text LIKE 'SELECT COUNT(*) FROM t1 WHERE c3 = %';
ADDRESS
CHILD_ADDRESS
6BA812EC
6BB34F64
STATEMENT
SELECT COUNT(*) FROM t1 WHERE c3 = :"SYS_B_0"
Parent
6BA812EC
Child
6BB34F64
26
© 2006 Julian Dyke
juliandyke.com
Cursor Sharing - Similar
Example - column with histogram
ALTER SYSTEM SET cursor_sharing = SIMILAR;
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
WHERE sql_text LIKE 'SELECT COUNT(*) FROM t1 WHERE c4 = %';
27
ADDRESS
CHILD_ADDRESS
STATEMENT
6B8A5D54
6BB2D674
SELECT COUNT(*) FROM t1 WHERE c4 = '0'
67026E34
6702E9A4
SELECT COUNT(*) FROM t1 WHERE c4 = :"SYS_B_0"
67026E34
671B91E0
SELECT COUNT(*) FROM t1 WHERE c4 = :"SYS_B_0"
67026E34
6B95A4A8
SELECT COUNT(*) FROM t1 WHERE c4 = :"SYS_B_0"
Parent
Parent
6B8A5D54
67026E34
Child
Child
Child
Child
6BB2D674
6702E9A4
671B91E0
6B95A4A8
© 2006 Julian Dyke
juliandyke.com
Multiple Child Cursors
28
Can be created for a number of reasons including differences
in:
System / Session parameters
Object translation
Bind variables
NLS parameters
© 2006 Julian Dyke
juliandyke.com
V$SQL_SHARED_CURSOR
SQL_ID
VARCHAR2(13)
DESCRIBE_MISMATCH
VARCHAR2(1)
DIFFERENT_LONG_LENGTH
VARCHAR2(1)
ADDRESS
RAW(4)
LANGUAGE_MISMATCH
VARCHAR2(1)
LOGICAL_STANDBY_APPLY
VARCHAR2(1)
CHILD_ADDRESS
RAW(4)
TRANSLATION_MISMATCH
VARCHAR2(1)
DIFF_CALL_DURN
VARCHAR2(1)
CHILD_NUMBER
NUMBER
ROW_LEVEL_SEC_MISMATCH
VARCHAR2(1)
BIND_UACS_DIFF
VARCHAR2(1)
UNBOUND_CURSOR
VARCHAR2(1)
INSUFF_PRIVS
VARCHAR2(1)
PLSQL_CMP_SWITCHS_DIFF
VARCHAR2(1)
SQL_TYPE_MISMATCH
VARCHAR2(1)
INSUFF_PRIVS_REM
VARCHAR2(1)
CURSOR_PARTS_MISMATCH
VARCHAR2(1)
OPTIMIZER_MISMATCH
VARCHAR2(1)
REMOTE_TRANS_MISMATCH
VARCHAR2(1)
STB_OBJECT_MISMATCH
VARCHAR2(1)
OUTLINE_MISMATCH
VARCHAR2(1)
LOGMINER_SESSION_MISMATCH
VARCHAR2(1)
ROW_SHIP_MISMATCH
VARCHAR2(1)
STATS_ROW_MISMATCH
VARCHAR2(1)
INCOMP_LTRL_MISMATCH
VARCHAR2(1)
PQ_SLAVE_MISMATCH
VARCHAR2(1)
LITERAL_MISMATCH
VARCHAR2(1)
OVERLAP_TIME_MISMATCH
VARCHAR2(1)
TOP_LEVEL_DDL_MISMATCH
VARCHAR2(1)
SEC_DEPTH_MISMATCH
VARCHAR2(1)
SQL_REDIRECT_MISMATCH
VARCHAR2(1)
MULTI_PX_MISMATCH
VARCHAR2(1)
EXPLAIN_PLAN_MISMATCH
VARCHAR2(1)
MV_QUERY_GEN_MISMATCH
VARCHAR2(1)
BIND_PEEKED_PQ_MISMATCH
VARCHAR2(1)
BUFFERED_DML_MISMATCH
VARCHAR2(1)
USER_BIND_PEEK_MISMATCH
VARCHAR2(1)
MV_REWRITE_MISMATCH
VARCHAR2(1)
PDML_ENV_MISMATCH
VARCHAR2(1)
TYPCHK_DEP_MISMATCH
VARCHAR2(1)
ROLL_INVALID_MISMATCH
VARCHAR2(1)
INST_DRTLD_MISMATCH
VARCHAR2(1)
NO_TRIGGER_MISMATCH
VARCHAR2(1)
OPTIMIZER_MODE_MISMATCH
VARCHAR2(1)
SLAVE_QC_MISMATCH
VARCHAR2(1)
FLASHBACK_CURSOR
VARCHAR2(1)
PX_MISMATCH
VARCHAR2(1)
TYPECHECK_MISMATCH
VARCHAR2(1)
ANYDATA_TRANSFORMATION
VARCHAR2(1)
MV_STALEOBJ_MISMATCH
VARCHAR2(1)
AUTH_CHECK_MISMATCH
VARCHAR2(1)
INCOMPLETE_CURSOR
VARCHAR2(1)
FLASHBACK_TABLE_MISMATCH
VARCHAR2(1)
BIND_MISMATCH
VARCHAR2(1)
TOP_LEVEL_RPI_CURSOR
VARCHAR2(1)
LITREP_COMP_MISMATCH
VARCHAR2(1)
29
© 2006 Julian Dyke
juliandyke.com
V$SQL_SHARED_CURSOR
30
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
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;
To list the hexadecimal values for each Boolean column use:
SELECT column_name, TO_CHAR (POWER (2,RANK () OVER (ORDER BY
column_id) - 1),'XXXXXXXXXXXXXXXX')
FROM dba_tab_columns
WHERE table_name = 'V_$SQL_SHARED_CURSOR'
AND data_type = 'VARCHAR2'
AND data_length = 1
ORDER BY column_id;
31
© 2006 Julian Dyke
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;
Change optimizer mode to ALL_ROWS
ALTER SESSION SET optimizer_mode = ALL_ROWS;
SELECT COUNT(*) FROM t1;
SELECT address, child_address, sql_text FROM v$sql
WHERE sql_text LIKE 'SELECT COUNT(*) FROM t1%';
32
ADDRESS
CHILD_ADDRESS
6B97E3C0
6BA0FC18
SELECT COUNT(*) FROM t1;
6B97E3C0
6BAE9904
SELECT COUNT(*) FROM t1;
© 2006 Julian Dyke
STATEMENT
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
0
1
6BA0FC18
6BAE9904
N
Y
OPTIMIZER_MODE_MISMATCH
Parent
6B97E3C0
optimizer_mode = CHOOSE
33
© 2006 Julian Dyke
Child
Child
6B9B6BE4
6BB158F0
optimizer_mode = ALL_ROWS
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
34
© 2006 Julian Dyke
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
juliandyke.com
Supported Optimizer Parameters
For example, OPTIMIZER_INDEX_CACHING
ALTER SESSION SET optimizer_index_caching = 0;
SELECT COUNT(*) FROM t1;
ALTER SESSION SET optimizer_index_caching = 20;
SELECT COUNT(*) FROM t1;
ALTER SESSION SET optimizer_index_caching = 40;
SELECT COUNT(*) FROM t1;
SELECT address, child_address, sql_text FROM v$sql
WHERE sql_text LIKE 'SELECT COUNT(*) FROM t1%';
35
ADDRESS
CHILD_ADDRESS
6B97E3C0
6BA937EC
SELECT COUNT(*) FROM t1;
6B97E3C0
6B855EB4
SELECT COUNT(*) FROM t1;
6B97E3C0
6BB1DE24
SELECT COUNT(*) FROM t1;
© 2006 Julian Dyke
STATEMENT
juliandyke.com
Supported Optimizer Parameters
As SYSDBA
SELECT
child_number,
child_address,
optimizer_mismatch
FROM v$sql_shared_cursor
WHERE address = ' 6B97E3C0'
CHILD_NUMBER
CHILD_ADDRESS
0
1
2
6BA937EC
6B855EB4
6BB1DE24
N
Y
Y
OPTIMIZER_MISMATCH
Parent
6B97E3C0
optimizer_index_caching
36
© 2006 Julian Dyke
Child
Child
Child
6BA937EC
6B855EB4
6BB1DE24
20
40
0
juliandyke.com
Unsupported Optimizer Parameters
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
To list unsupported optimizer parameters use:
SELECT pname_qkscesyrow FROM x$qkscesys
WHERE SUBSTR (pname_qkscesyrow,1,1) = '_'
ORDER BY 1;
37
© 2006 Julian Dyke
juliandyke.com
Unsupported Optimizer Parameters
For example, _UNNEST_SUBQUERY
In Oracle 10.2, default value is TRUE
ALTER SESSION SET "_unnest_subquery" = TRUE;
SELECT COUNT(*) FROM t1;
ALTER SESSION SET "_unnest_subquery" = FALSE;
SELECT COUNT(*) FROM t1;
SELECT address, child_address, sql_text FROM v$sql
WHERE sql_text LIKE 'SELECT COUNT(*) FROM t1%';
38
ADDRESS
CHILD_ADDRESS
6B97E3C0
6B879828
SELECT COUNT(*) FROM t1;
6B97E3C0
6B976F20
SELECT COUNT(*) FROM t1;
© 2006 Julian Dyke
STATEMENT
juliandyke.com
Unsupported Optimizer Parameters
As SYSDBA
SELECT
child_number,
child_address,
optimizer_mismatch
FROM v$sql_shared_cursor
WHERE address = ' 6B97E3C0'
CHILD_NUMBER
CHILD_ADDRESS
0
1
6B879828
6B976F20
N
Y
OPTIMIZER_MISMATCH
Parent
6B97E3C0
_unnest_subquery
39
© 2006 Julian Dyke
Child
Child
6B879828
6B976F20
TRUE
FALSE
juliandyke.com
Trace
Enabling trace results in multiple child cursors
For example
SELECT COUNT(*) FROM t1;
EXECUTE DBMS_MONITOR.SESSION_TRACE_ENABLE;
SELECT COUNT(*) FROM t1;
EXECUTE
DBMS_MONITOR.SESSION_TRACE_DISABLE;
SELECT COUNT(*)
FROM t1;
SELECT address, child_address, sql_text FROM v$sql
WHERE sql_text LIKE 'SELECT COUNT(*) FROM t1%';
40
ADDRESS
CHILD_ADDRESS
6B97E27C
6B99348C
SELECT COUNT(*) FROM t1;
6B97E27C
6B895F5C
SELECT COUNT(*) FROM t1;
© 2006 Julian Dyke
STATEMENT
juliandyke.com
Trace
SELECT
child_number,
child_address,
stats_row_mismatch
FROM v$sql_shared_cursor
WHERE address = ' 6B97E27C'
CHILD_NUMBER
CHILD_ADDRESS
0
1
6B99348C
6B895F5C
N
Y
STATS_ROW_MISMATCH
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
41
© 2006 Julian Dyke
Parent
6B97E3C0
Child
Child
6B99348C
6B895F5C
FALSE
TRUE
juliandyke.com
Translations
If a statement references different objects with the same name
then multiple child cursors can be generated
For example:
USER1
USER2
CREATE TABLE t1
(c1 NUMBER);
CREATE TABLE t1
(c1 NUMBER);
SELECT c1 FROM t1;
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
© 2006 Julian Dyke
USER1.T1
SELECT c1
FROM t1;
Child
Cursor 2
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%';
43
ADDRESS
HASH_VALUE CHILD_NUMBER
CHILD_ADDRESS
6B8E5AEC
3805054639
0
6B8B6C30
6B8E5AEC
3805054639
1
6B8DA100
© 2006 Julian Dyke
juliandyke.com
Translations
SELECT
child_number,
child_address,
auth_check_mismatch,
translation_mismatch
FROM v$sql_shared_cursor
WHERE address = ' 6B8E5AEC'
CHILD_NUMBER
0
1
6B8B6C30
6B8DA100
AUTH_CHECK_MISMATCH
N
Y
TRANSLATION_MISMATCH
N
Y
CHILD_ADDRESS
Parent
6B9B7F74
44
© 2006 Julian Dyke
Child
Child
6B91CA58
6BA1DB48
USER1
USER2
juliandyke.com
Translations
Determining translated objects
SELECT
kgltrorg,
kgltrfnl
FROM x$kgltr
WHERE kglhdadr = '6B8B6C30';
KGLTRORG
KGLTRFNL
KGLTRORG
KGLTRFNL
6BA68DAC
6BA68DAC
6B8F9220
6B8F9220
SELECT
kglnaown
kglnaobj
FROM x$kglob
WHERE kglhdadr = '6BA68DAC';
45
SELECT
kgltrorg,
kgltrfnl
FROM x$kgltr
WHERE kglhdadr = '6B8DA100';
SELECT
kglnaown
kglnaobj
FROM x$kglob
WHERE kglhdadr = '6B8F9220';
KGLNAOWN
KGLNAOBJ
KGLNAOWN
KGLNAOBJ
USER1
T1
USER2
T1
© 2006 Julian Dyke
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 = %';
46
ADDRESS
HASH_VALUE CHILD_NUMBER
CHILD_ADDRESS
6B9B6F74
357538776
0
6B91CA58
6B9B6F74
357538776
1
6BA1DB48
© 2006 Julian Dyke
juliandyke.com
Bind Variables
SELECT
child_number,
child_address,
bind_mismatch
FROM v$sql_shared_cursor
WHERE address = ' 6B9B7F74'
CHILD_NUMBER
0
CHILD_ADDRESS
1
6B91CA58 6BA1DB48
BIND_MISMATCH
N
Y
Parent
6B9B7F74
Child
Child
6B91CA58
6BA1DB48
VARCHAR2(30)
47
© 2006 Julian Dyke
VARCHAR2(40)
juliandyke.com
V$SQL_BIND_METADATA
48
Describes bind variables for each cursor in shared pool
ADDRESS
RAW(4)
POSITION
NUMBER
DATATYPE
NUMBER
MAX_LENGTH
NUMBER
ARRAY_LEN
NUMBER
BIND_NAME
VARCHAR2(30)
Based on X$KKSBV
Note, in this case ADDRESS is the address of the child cursor
© 2006 Julian Dyke
juliandyke.com
Bind Variables
To check length of bind variables
SELECT
address,
position,
data_type,
max_length,
bind_name
FROM v$sql_bind_metadata
WHERE address IN
(
SELECT child_address FROM v$sql
WHERE address = '6B9B7F74'
);
49
ADDRESS
POSITION
DATATYPE
MAX_LENGTH
BIND_NAME
6B91CA58
1
1
32
V1
6BA1DB48
1
1
128
V1
© 2006 Julian Dyke
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
© 2006 Julian Dyke
juliandyke.com
Bind Variables
51
For example, by default the following sessions will all
generate different child cursors:
VAR b1 VARCHAR2(30)
VAR b1 VARCHAR2(30)
VAR b2 VARCHAR2(30)
VAR b2 VARCHAR2(60)
SELECT c1 FROM t1
WHERE :b1 = 100
AND
:b2 = 200;
SELECT c1 FROM t1
WHERE :b1 = 100
AND
:b2 = 200;
VAR b1 VARCHAR2(60)
VAR b1 VARCHAR2(60)
VAR b2 VARCHAR2(30)
VAR b2 VARCHAR2(60)
SELECT c1 FROM t1
WHERE :b1 = 100
AND
:b2 = 200;
SELECT c1 FROM t1
WHERE :b1 = 100
AND
:b2 = 200;
© 2006 Julian Dyke
juliandyke.com
Bind Variables
52
On the other hand the following statements will all use the
same child cursor:
VAR b1 VARCHAR2(40)
VAR b1 VARCHAR2(40)
VAR b2 VARCHAR2(40)
VAR b2 VARCHAR2(60)
SELECT c1 FROM t1
WHERE :b1 = 100
AND
:b2 = 200;
SELECT c1 FROM t1
WHERE :b1 = 100
AND
:b2 = 200;
VAR b1 VARCHAR2(60)
VAR b1 VARCHAR2(60)
VAR b2 VARCHAR2(40)
VAR b2 VARCHAR2(60)
SELECT c1 FROM t1
WHERE :b1 = 100
AND
:b2 = 200;
SELECT c1 FROM t1
WHERE :b1 = 100
AND
:b2 = 200;
© 2006 Julian Dyke
juliandyke.com
Internationalization
53
Internationalization affects child cursors
Only a subset of SQL statements are affected including
statements using:
Dates
Currency
Ordering
© 2006 Julian Dyke
juliandyke.com
Internationalization
Example 1 - Dates
VAR b1 VARCHAR(30);
EXECUTE b1 := SYSDATE;
ALTER SESSION SET NLS_LANGUAGE = 'AMERICAN';
SELECT TO_CHAR (TO_DATE (:b1,'DD-MON-YYYY'),'yyyymmdd')
FROM dual;
ALTER SESSION SET NLS_LANGUAGE = 'GERMAN';
SELECT TO_CHAR (TO_DATE (:b1,'DD-MON-YYYY'),'yyyymmdd')
FROM dual;
SELECT address,hash_value,child_number,child_address
FROM v$sql
WHERE sql_text LIKE 'SELECT TO_CHAR (TO_DATE (:b1%';
54
ADDRESS
HASH_VALUE CHILD_NUMBER
CHILD_ADDRESS
6B94EA84
659654739
0
6BA268F0
6B94EA84
659654739
1
6B8E3B20
© 2006 Julian Dyke
juliandyke.com
Internationalization
SELECT
child_number,
child_address,
language_mismatch
FROM v$sql_shared_cursor
WHERE address = ' 6B94EA84'
CHILD_NUMBER
CHILD_ADDRESS
0
1
6BA268F0
6B8E3B20
N
Y
LANGUAGE_MISMATCH
Parent
6B94EA84
Child
Child
6BA268F0
6B8E3B20
AMERICAN
55
© 2006 Julian Dyke
GERMAN
juliandyke.com
Internationalization
Example 2 - Ordering
CREATE TABLE t1 (c1 NUMBER, c2 VARCHAR2(1));
ALTER SESSION SET NLS_LANGUAGE = 'AMERICAN';
SELECT c1 FROM t1 ORDER BY c2;
ALTER SESSION SET NLS_LANGUAGE = 'GERMAN';
SELECT c1 FROM t1 ORDER BY c2;
SELECT address,hash_value,child_number,child_address
FROM v$sql
WHERE sql_text LIKE 'SELECT c1 FROM t1 ORDER BY t2%';
56
ADDRESS
HASH_VALUE CHILD_NUMBER
CHILD_ADDRESS
6BA0358C
245919138
0
6BA09B74
6BA0358C
245919138
1
6B9D4560
© 2006 Julian Dyke
juliandyke.com
Internationalization
SELECT
child_number,
child_address,
language_mismatch
FROM v$sql_shared_cursor
WHERE address = ' 6BA0358C'
CHILD_NUMBER
CHILD_ADDRESS
0
1
6BA09B74
6B9D4560
N
Y
LANGUAGE_MISMATCH
Parent
6BA0358C
Child
Child
6BA09B74
6B9D4560
AMERICAN
57
© 2006 Julian Dyke
GERMAN
juliandyke.com
Public Synonyms
This example shows behaviour of public synonyms
As USER1
CREATE TABLE t1 (c1 NUMBER,c2 NUMBER);
GRANT SELECT ON t1 TO PUBLIC;
CREATE PUBLIC SYNONYM t1 FOR user1.t1;
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%';
58
ADDRESS
HASH_VALUE CHILD_NUMBER
CHILD_ADDRESS
6B96CB1C
2856096030
6B8959AC
© 2006 Julian Dyke
0
juliandyke.com
Public Synonyms
SELECT owner,namespace,type,sharable_mem
FROM v$db_object_cache
WHERE name = 'T1';
OWNER
NAMESPACE
TYPE
PUBLIC
TABLE/PROCEDURE
SYNONYM
345
USER1
TABLE/PROCEDURE
TABLE
343
USER2
TABLE/PROCEDURE
NOT LOADED
59
SHARABLE_MEM
0
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
© 2006 Julian Dyke
juliandyke.com
Public Synonyms
Each user requires one additional library cache object for
each public synonym referenced
Parent
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
6B96CB1C
Child
Table
6B91CA58
USER1.T1
Synonym
PUBLIC.T1
Table
USER2.N1
Table
USER3.N1
60
© 2006 Julian Dyke
SELECT COUNT (*)
FROM USER1.t1;
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);
For example (output modified for readability):
SIZE(K) KEPT
NAME
------- ------ ------------------------------------------428
SYS.STANDARD
(PACKAGE)
200
SYS.ANYDATA
(TYPE)
167
SELECT COUNT(*) FROM t1,t2 WHERE..
(6B8551B8,593239587)
61
(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
'P','p':
Package/procedure/function
'T','t':
Type
'R','r':
Trigger
'Q','q':
Sequence
For example
EXECUTE dbms_shared_pool.keep ('SYS.STANDARD','P');
62
Any other value for <type> specifies a cursor
Other object types including tables and views cannot be kept
in Oracle 10.2 or below
© 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)
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
© 2006 Julian Dyke
juliandyke.com
And Finally...
To flush the shared pool use:
ALTER SYSTEM FLUSH SHARED_POOL;
64
Flushes all objects which are not currently pinned
© 2006 Julian Dyke
juliandyke.com
Any Questions ?
[email protected]
65
© 2006 Julian Dyke
juliandyke.com
Conclusion
66
To avoid library cache invalidations
Avoid unnecessary DDL statements in application
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
© 2006 Julian Dyke
juliandyke.com