Вы находитесь на странице: 1из 66

Library Cache Internals

Julian Dyke Independent Consultant


Web Version
1

2006 Julian Dyke

juliandyke.com

Agenda

Introduction Multiple Parent Cursors Multiple Child Cursors DBMS_SHARED_POOL Summary

2006 Julian Dyke

juliandyke.com

Shared Pool

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

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 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

2006 Julian Dyke

juliandyke.com

Namespaces

Every object in the library cache belongs to a namespace Namespaces include:


Cursor Table/Procedure Body Trigger Index Cluster Object Java Application

Source Java Resource Context Policy Publish/Subscribe Dimension


7

Context Stored Outline Ruleset Resource Plan Resource Consumer Group Subscription Location Remote Object Snapshot Metadata Java Shared Data Security Profile

2006 Julian Dyke

juliandyke.com

V$DB_OBJECT_CACHE

Reports all objects currently in the library cache


OWNER
NAME DB_LINK NAMESPACE TYPE SHARABLE_MEM LOADS

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

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';

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

Child 1

Child 2

Child 3

10

2006 Julian Dyke

juliandyke.com

Parent Cursor

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)

11

2006 Julian Dyke

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

2006 Julian Dyke

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

Contains one row for each parent cursor


VARCHAR2(1000) CLOB VARCHAR2(13) NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER VARCHAR2(19) NUMBER NUMBER NUMBER NUMBER BUFFER_GETS APPLICATION_WAIT_TIME CONCURRENCY_WAIT_TIME CLUSTER_WAIT_TIME USER_IO_WAIT_TIME PLSQL_EXEC_TIME JAVA_EXEC_TIME ROWS_PROCESSED COMMAND_TYPE OPTIMIZER_MODE OPTIMIZER_COST OPTIMIZER_ENV OPTIMIZER_ENV_HASH_VALUE PARSING_USER_ID PARSING_SCHEMA_ID PARSING_SCHEMA_NAME KEPT_VERSIONS ADDRESS HASH_VALUE OLD_HASH_VALUE PLAN_HASH_VALUE MODULE NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER VARCHAR2(10) NUMBER RAW(797) NUMBER NUMBER NUMBER VARCHAR2(64) NUMBER RAW(4) NUMBER NUMBER NUMBER VARCHAR2(64) MODULE_HASH ACTION ACTION_HASH SERIALIZABLE_ABOUTS OUTLINE_CATEGORY CPU_TIME ELAPSED_TIME OUTLINE_SID LAST_ACTIVE_CHILD_ADDRESS REMOTE OBJECT_STATUS LITERAL_HASH_VALUE LAST_LOAD_TIME IS_OBSOLETE CHILD_LATCH SQL_PROFILE PROGRAM_ID PROGRAM_LINE# EXACT_MATCHING_SIGNATURE FORCE_MATCHING_SIGNATURE LAST_ACTIVE_TIME BIND_DATA NUMBER VARCHAR2(64) NUMBER NUMBER VARCHAR2(64) NUMBER NUMBER VARCHAR2(40) RAW(4) VARCHAR2(1) VARCHAR2(19) NUMBER DATE VARCHAR2(1) NUMBER VARCHAR2(64) NUMBER NUMBER NUMBER NUMBER DATE RAW(2000)

13

2006 Julian Dyke

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

2006 Julian Dyke

juliandyke.com

Child Cursors
KGLHD KGLOB KGLNA Parent Cursor

KGLHD

KGLHD

KGLHD

KGLHD

KGLHD

KGLHD

15

2006 Julian Dyke

juliandyke.com

Child Cursors
KGLHD
Child Cursor

KGLOB

Heap 0

Heap 6

Environment

Statistics

Bind Variables

Execution Plan

16

2006 Julian Dyke

juliandyke.com

V$SQL

SQL_TEXT SQL_FULLTEXT SQL_ID SHARABLE_MEM PERSISTENT_MEM RUNTIME_MEM SORTS LOADED_VERSIONS OPEN_VERSIONS USERS_OPENING FETCHES

Contains one row for each child cursor


VARCHAR2(1000) CLOB VARCHAR2(13) NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER CLUSTER_WAIT_TIME USER_IO_WAIT_TIME NUMBER NUMBER MODULE_HASH ACTION ACTION_HASH SERIALIZABLE_ABORTS OUTLINE_CATEGORY CPU_TIME ELAPSED_TIME OUTLINE_SID CHILD_ADDRESS SQLTYPE REMOTE OBJECT_STATUS LITERAL_HASH_VALUE LAST_LOAD_TIME IS_OBSOLETE CHILD_LATCH SQL_PROFILE PROGRAM_ID PROGRAM_LINE# EXACT_MATCHING_SIGNATURE FORCE_MATCHING_SIGNATURE LAST_ACTIVE_TIME BIND_DATA NUMBER VARCHAR2(64) NUMBER NUMBER VARCHAR2(64) NUMBER NUMBER NUMBER RAW(4) NUMBER VARCHAR2(1) VARCHAR2(19) NUMBER VARCHAR2(19) VARCHAR2(1) NUMBER VARCHAR2(64) NUMBER NUMBER NUMBER NUMBER DATE RAW(2000)

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

2006 Julian Dyke

juliandyke.com

Object Heaps

Every object can have optional sub heaps


Heap # 0 1 2 3 4 5 Description Object Source DIANA PCODE MCODE Errors

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)

2006 Julian Dyke

juliandyke.com

Multiple Parent Cursors

Each parent requires at least one child cursor

Parent

Parent

Parent

Parent

Child

Child

Child

Child

19

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;

Some Oracle tools perform limited formatting to standardize SQL statements e.g. SQL*Plus and PL/SQL

20

2006 Julian Dyke

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

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%'; ADDRESS 6BA7F7F8 6B8FB104 CHILD_ADDRESS 6B9B6BE4 6BB158F0 STATEMENT SELECT c2 FROM t1 WHERE c1 = 0 SELECT c2 FROM t1 WHERE c1 = 1

Parent
6BA7F7F8

Parent
6B8FB104

Child
6B9B6BE4

Child
6BB158F0

22

2006 Julian Dyke

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 6BA93574 CHILD_ADDRESS 6B8D1A84 STATEMENT 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 6BA812EC

CHILD_ADDRESS 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 = %'; ADDRESS CHILD_ADDRESS STATEMENT

6B8A5D54
67026E34 67026E34 67026E34

6BB2D674
6702E9A4 671B91E0 6B95A4A8

SELECT COUNT(*) FROM t1 WHERE c4 = '0'


SELECT COUNT(*) FROM t1 WHERE c4 = :"SYS_B_0" SELECT COUNT(*) FROM t1 WHERE c4 = :"SYS_B_0" SELECT COUNT(*) FROM t1 WHERE c4 = :"SYS_B_0"

Parent
6B8A5D54

Parent
67026E34

Child
6BB2D674 27

Child
6702E9A4

Child
671B91E0

Child
6B95A4A8

2006 Julian Dyke

juliandyke.com

Multiple Child Cursors

Can be created for a number of reasons including differences in: System / Session parameters Object translation Bind variables NLS parameters

28

2006 Julian Dyke

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

2006 Julian Dyke

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

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%'; ADDRESS 6B97E3C0 6B97E3C0 CHILD_ADDRESS 6BA0FC18 6BAE9904 STATEMENT SELECT COUNT(*) FROM t1; SELECT COUNT(*) FROM t1;

32

2006 Julian Dyke

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

2006 Julian Dyke

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

2006 Julian Dyke

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%'; ADDRESS 6B97E3C0 6B97E3C0 6B97E3C0 CHILD_ADDRESS 6BA937EC 6B855EB4 6BB1DE24 STATEMENT SELECT COUNT(*) FROM t1; SELECT COUNT(*) FROM t1; SELECT COUNT(*) FROM t1;

35

2006 Julian Dyke

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 6BA937EC 1 6B855EB4 2 6BB1DE24

OPTIMIZER_MISMATCH

Parent
6B97E3C0

Child
6BA937EC optimizer_index_caching 36 0

Child
6B855EB4 20

Child
6BB1DE24 40

2006 Julian Dyke

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%'; ADDRESS 6B97E3C0 6B97E3C0 CHILD_ADDRESS 6B879828 6B976F20 STATEMENT SELECT COUNT(*) FROM t1; SELECT COUNT(*) FROM t1;

38

2006 Julian Dyke

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 6B879828 1 6B976F20

OPTIMIZER_MISMATCH

Parent
6B97E3C0

Child
6B879828 _unnest_subquery 39 TRUE

Child
6B976F20 FALSE

2006 Julian Dyke

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%'; ADDRESS 6B97E27C 6B97E27C CHILD_ADDRESS 6B99348C 6B895F5C STATEMENT SELECT COUNT(*) FROM t1; SELECT COUNT(*) FROM t1;

40

2006 Julian Dyke

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

2006 Julian Dyke

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

SELECT c1 FROM t1;


Child Cursor 2

2006 Julian Dyke

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

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 CHILD_ADDRESS 0 6B8B6C30 1 6B8DA100

AUTH_CHECK_MISMATCH
TRANSLATION_MISMATCH Parent
6B9B7F74

N
N

Y
Y

Child
6B91CA58 44

Child
6BA1DB48 USER2

2006 Julian Dyke

USER1

juliandyke.com

Translations

Determining translated objects


SELECT kgltrorg, kgltrfnl FROM x$kgltr WHERE kglhdadr = '6B8DA100'; KGLTRORG 6B8F9220 KGLTRFNL 6B8F9220

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

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 = %'; ADDRESS 6B9B6F74 6B9B6F74 HASH_VALUE CHILD_NUMBER 357538776 357538776 0 1 CHILD_ADDRESS 6B91CA58 6BA1DB48

46

2006 Julian Dyke

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)

2006 Julian Dyke

juliandyke.com

V$SQL_BIND_METADATA

Describes bind variables for each cursor in shared pool


ADDRESS POSITION DATATYPE MAX_LENGTH ARRAY_LEN BIND_NAME RAW(4) NUMBER NUMBER NUMBER NUMBER VARCHAR2(30)

Based on X$KKSBV Note, in this case ADDRESS is the address of the child cursor

48

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' );

ADDRESS 6B91CA58 6BA1DB48

POSITION 1 1

DATATYPE 1 1

MAX_LENGTH 32 128

BIND_NAME V1 V1

49

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

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

2006 Julian Dyke

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

2006 Julian Dyke

juliandyke.com

Internationalization

Internationalization affects child cursors Only a subset of SQL statements are affected including statements using: Dates Currency Ordering

53

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%';

ADDRESS
6B94EA84 6B94EA84
54

HASH_VALUE
659654739 659654739

CHILD_NUMBER
0 1

CHILD_ADDRESS
6BA268F0 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 LANGUAGE_MISMATCH Parent


6B94EA84

0 6BA268F0 N

1 6B8E3B20 Y

Child
6BA268F0 AMERICAN 55

Child
6B8E3B20 GERMAN

2006 Julian Dyke

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%'; ADDRESS 6BA0358C 6BA0358C
56

HASH_VALUE CHILD_NUMBER 245919138 245919138 0 1

CHILD_ADDRESS 6BA09B74 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 LANGUAGE_MISMATCH

0
6BA09B74 N

1
6B9D4560 Y

Parent
6BA0358C

Child
6BA09B74
AMERICAN 57

Child
6B9D4560
GERMAN

2006 Julian Dyke

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%';
ADDRESS 6B96CB1C HASH_VALUE CHILD_NUMBER 2856096030 0 CHILD_ADDRESS 6B8959AC

58

2006 Julian Dyke

juliandyke.com

Public Synonyms
SELECT owner,namespace,type,sharable_mem FROM v$db_object_cache WHERE name = 'T1'; OWNER PUBLIC USER1 USER2

NAMESPACE TABLE/PROCEDURE TABLE/PROCEDURE TABLE/PROCEDURE

TYPE SYNONYM TABLE NOT LOADED

SHARABLE_MEM 345 343 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

59

2006 Julian Dyke

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

2006 Julian Dyke

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):


NAME

SIZE(K) KEPT

------- ------ ------------------------------------------428 200 167 SYS.STANDARD SYS.ANYDATA (PACKAGE) (TYPE)

SELECT COUNT(*) FROM t1,t2 WHERE.. (6B8551B8,593239587) (CURSOR)

61

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');

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

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;

Flushes all objects which are not currently pinned

64

2006 Julian Dyke

juliandyke.com

Any Questions ?

info@juliandyke.com
65

2006 Julian Dyke

juliandyke.com

Conclusion

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

66

2006 Julian Dyke

juliandyke.com

Вам также может понравиться