Professional Documents
Culture Documents
HASH
Handles
Library cache SQL
1.
2.
3.
4.
5. SELECT
1 MSQL1.SQL
Plus*SQL SQL
Plus*SQL
SQL
1. ++
2.
3.
Oracle
V$SYSSTAT Oracle
-1-
V$sysstatV$sesstatV$mystatV$statname
DESC
2
3
V$SQL V$SQLAREA
3 V$SQL V$SQLAREA
PL/SQL SQL
Executions HASH_VALUE
set timing on
4
MSQL7.SQL
--
declare
msql varchar2(500);
mcur number;
mstat number;
jg varchar2(4000);
cg number;
begin
mcur:=dbms_sql.open_cursor; --
msql:='select myid from t4 where myid=:x';
for i in 1..5000 loop
dbms_sql.parse(mcur,'select myid from t4 where myid=:x',dbms_sql.native);
dbms_sql.bind_variable(mcur,':x',i);
dbms_sql.define_column(mcur,1,jg,4000);
mstat:=dbms_sql.execute(mcur);
cg:=dbms_sql.fetch_rows(mcur);
dbms_sql.column_value(mcur,1,jg);
dbms_output.put_line(':'||jg);
end loop;
dbms_sql.close_cursor(mcur);
end;
/
MSQL6.SQL
--
declare
msql varchar2(500);
mcur number;
mstat number;
jg varchar2(4000);
cg number;
begin
mcur:=dbms_sql.open_cursor;
for i in 1..1 loop
msql:='select myid from t1 where myid='||to_char(i);
dbms_sql.parse(mcur,'select myid from t1 where myid='||to_char(i),dbms_sql.native);
dbms_sql.define_column(mcur,1,jg,4000);
mstat:=dbms_sql.execute(mcur);
-2-
cg:=dbms_sql.fetch_rows(mcur);
dbms_sql.column_value(mcur,1,jg);
dbms_output.put_line(':'||jg);
end loop;
dbms_sql.close_cursor(mcur);
end;
/
5
5000 Set timing on
declare
type rc is ref cursor;
l_cur rc;
begin
for i in 1..5000 loop
open l_cur for 'select myid from t1 where myid='||i;
close l_cur;
end loop;
for i in 1..5000 loop
open l_cur for 'select myid from t2 where myid='||i;
close l_cur;
end loop;
end;
/
declare
type rc is ref cursor;
l_cur rc;
begin
for i in 1..5000 loop
open l_cur for 'select myid from t1 where myid=:x' using i;
close l_cur;
end loop;
end;
/
6
MSQL8.SQL
--
--create or replace procedure my_cursor is
declare
cursor aa1(mm in number) is select id from t1 where myid=mm;
mx number;
begin
for i in 1..1000 loop
open aa1(i);
fetch aa1 into mx;
dbms_output.put_line(':'||mx);
close aa1;
end loop;
-3-
end;
/
DDL
DDL
DDL
ORACLE
1
2
3
HASH HASH
HASH
Library cache
Library cache SQL
V$librarycache Library cache SQL
Library cache
1.
SQL and PL/SQL objects
tables, indexes, and so on
2.
LIBRARY
Library cache
Library cache
Library cache
1000
1001
A1
A2
1000
1001
A1
B1
B1
-4-
A2
Heap
malloc
Gets Pins
V$Librarycache
GETS
GETHITS
GETHITRATIO
PINS
PINHITS
PINHITRATIO
RELOADS
INVALIDATIONS
8
select * from v$librarycache where namespace='SQL AREA'; GETS PINS
X$KGLOB
1.
GETHITRATIO
PINHITRATIO
2. ReloadsInvalidations
Library cache PIN LOCK
Library cache lock Library cache pin
1. Library cache lock Library cache pin
Library cache
Lock Pin 0
Locks Locks
Null
Pin
Pin
9 Lock
Pin
Pin
Share (s) :
Exclusive (x) :
Pinned Share Exclusive
Share Pin Exclusive Pin Pin
Break
lock/pin
1). DDL Exclusive() Lock Pin(
)
:,,,
-6-
10
DDLcreate table big_table_2 as select * from big_table
DDL X$KGLOB Big_table LOCK PIN DESC
SQL SQL
SQL
SQL Library cace
SQL
SQL
SQL PGA
PGA
PGA Oracle
Oracle PGA PGA 0.5M
PGA
12 PGA
Show_pga.sql
SUBSTR(NAME,1,30)
SID VALUE
--------------------------------------------------------------------- ---------session uga memory
12 76960
session uga memory max
12 76960
session pga memory
12 220460
session pga memory max
12 220460
UGA PGA
pga session pga memory PGA
session pga memory max PGA PGA
-7-
SQL
persistent area
run-time area
persistent area
2).
cancel
SCN
SQLDLL SQL
TOM SQL UGA
-8-
declare
cursor aa1 is select id from t1 where myid<=10;
mx number;
begin
open aa1; ------>
dbms_output.put_line(' 1:'||aa1%rowcount); ----> Oracle
---- 0
for i in 1..10 loop
fetch aa1 into mx; ---- Buffer ---cache Buffer cache ---Buffer cache buffer cache ------ mx ---
dbms_output.put_line(':'||mx);
end loop;
dbms_output.put_line(' 2:'||aa1%rowcount); ---- 10 rowcount
---- 10
close aa1;
end;
/
Oracle
14
T4_1 0 31505 31520 Buffer cache 31507 31520
Oracle buffer
Oracle
scott@MYTWO> set autotrace traceonly;
scott@MYTWO> select * from aa_1;
Execution Plan
---------------------------------------------------------0 SELECT STATEMENT Optimizer=CHOOSE
1 0 TABLE ACCESS (FULL) OF 'AA_1'
Statistics
---------------------------------------------------------0 recursive calls
0 db block gets
3 consistent gets
0 physical reads
0 redo size
215 bytes sent via SQL*Net to client
372 bytes received via SQL*Net from client
1 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
0 rows processed
select * from aa_1
3 Oracle Buffer cache
Oracle
Oracle Oracle Oracle
Buffer cache
SQL SQL
SQL
SQL
SQL
Library cache
1
V$open_cursor Oracle X$KGLLK
Library cache
10 V$open_cursor X$KGLLK
v$fixed_view_definition Oracle V$
V$OPEN_CURSOR
select view_definition from v$fixed_view_definition where view_name='V$OPEN_CURSOR';
V$OPEN_CURSOR X$KGLLK
- 11 -
2.
alter session set events '10046 trace name context forever,level 12';
declare
cursor aa1 is select id from t4_1;
mx number;
begin
open aa1;
close aa1;
end;
/
alter session set events '10046 trace name context off';
3. T4_1 Buffer cache
sys@MYTWO> select FILE#,dbablk,state from x$bh where obj=7487;
FILE# DBABLK STATE
---------- ---------- ---------5 31507
1
select id from t4_1 31507 Buffer cache
PARSING IN CURSOR #2 len=19 dep=1 uid=30 oct=3 lid=30 tim=2494060919187 hv=2346570808 ad='79e0c314'
SELECT id from t4_1
END OF STMT
PARSE #2:c=0,e=41730,p=2,cr=41,cu=0,mis=1,r=0,dep=1,og=4,tim=2494060919178
BINDS #2:
EXEC #2:c=0,e=55,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=4,tim=2494060919307
SELECT id from t4_1
WAIT #1: nam='db file sequential read' ela= 9560 p1=5 p2=31507 p3=1
P1=5 p2=31507 5 31507 t4_1
- 12 -
Oracle v$event_name 9i
361 library cache lock library cache pin
14
create or replace procedure my_cursor is
mx number;
begin
dbms_output.put_line(Start);
dbms_lock.sleep(30);
dbms_output.put_line(End);
end;
/
grant execute on my_cursor to jj;
V$SESSION_WAIT
SID: session
EVENT: session
WAIT_TIME: session () 0 session session
SEQ#: session
P1, P2, P3:
P1TEXT, P2TEXT, P3TEXT: p1,p2,p3
1.State
(1)WaitingSESSION
(2)Waited unknown time timed_statistics falseWait short time
V$SESSION_EVENT
- 13 -
SIDsession
EVENTsession
TOTAL_WAITS session
TIME_WAITED session ()
AVERAGE_WAIT session ()
TOTAL_TIMEOUTS
V$system_event V$session_event SID
V$system_event V$session_event
TIME_WAITED_MICRO TOTAL_WAITS
1TOTAL_TIMEOUTS 1
TOTAL_WAITS TOTAL_TIMEOUTS
TOTAL_WAITS TOTAL_TIMEOUTS
+1
+1
+1
+1
V$session_wait Oracle
V$session_event
TIME_WAITED_MICRO
SEQ# STATE WAITING
SECONDS_IN_WAIT SEQ# 1
SECONDS_IN_WAIT Oracle
Library cache Lock Library cache pin
1. Library cache Lock Library cache pin
2.
MSQL6.SQL 5000
SHOW_WAIT.SQL library cache pin latch free
Latch free library cache latch Library cache Library cache
Latch Latch Latch
Library cache pin NULL Oracle
CURSOR_SPACE_FOR_TIME SESSION_CACHED_CURSORS
1. CURSOR_SPACE_FOR_TIME
SQL SQL
15 CURSOR_SPACE_FOR_TIME
CURSOR_SPACE_FOR_TIME
- 14 -
1. 1
1. alter system set cursor_space_for_time=false scope=spfile;
2. shutdown immediate; --
3. Startup;
2. 2
select * from aa_1;
3. 1
select kglhdadr,kglhdpar,kglhdlmd,kglhdpmd,kglobhs0,kglobhs6,
kglobhs0+kglobhs1+kglobhs2+kglobhs3+kglobhs4+kglobhs5+kglobhs6 MEM
from x$kglob where kglnaobj like 'select * from aa_1';
KGLHDADR KGLHDPAR KGLHDLMD KGLHDPMD KGLOBHS0 KGLOBHS6 MEM
-------- -------- ---------- ---------- ---------- ---------- ----------------- -------- ---------- ---------- ---------- ---------- -------79EBC2A4
79EBC820
1
0
1920
2208
4128
79EBC820
79EBC820
1
0
1436
0
1436
PIN
4. 3
select namespace, gets, gethits, pins, pinhits from v$librarycache where namespace = 'SQL AREA';
sys@MYTWO> select namespace, gets, gethits, pins, pinhits from v$librarycache where namespace = 'SQL AREA';
NAMESPACE
GETS GETHITS PINS PINHITS
--------------- ---------- ---------- ---------- ------------------------- ---------- ---------- ---------- ---------SQL AREA
399
307
1901
1695
5. 2
Select * from aa_1;
6. 3
sys@MYTWO> select namespace, gets, gethits, pins, pinhits from v$librarycache where namespace = 'SQL AREA';
NAMESPACE
GETS GETHITS PINS PINHITS
--------------- ---------- ---------- ---------- ------------------------- ---------- ---------- ---------- ---------SQL AREA
401
309
1907
1701
456 2 select * from aa_1 GETS 1PINS 3
6 4 GETSGETHITS 2PINSPINHITS 6
select namespace, gets, gethits, pins, pinhits from v$librarycache where namespace = 'SQL AREA'
GETS PINS select * from aa_1 GETS PINS
7. 4
@msql6 -- 3000 3000
8. 1
select kglhdadr,kglhdpar,kglhdlmd,kglhdpmd,kglobhs0,kglobhs6,
kglobhs0+kglobhs1+kglobhs2+kglobhs3+kglobhs4+kglobhs5+kglobhs6 MEM
from x$kglob where kglnaobj like 'select * from aa_1';
KGLHDADR KGLHDPAR KGLHDLMD KGLHDPMD KGLOBHS0 KGLOBHS6 MEM
-------- -------- ---------- ---------- ---------- ---------- ------------------ -------- ---------- ---------- ---------- ---------- ---------79EBC2A4
79EBC820
1
0
1920
0
1920
79EBC820
79EBC820
1
0
1436
0
1436
LOCK 1 6
- 15 -
3000 3000 Library cache
CURSOR_SPACE_FOR_TIME FALSE
v$librarycacheGETS GETHITS
5PINS 19 PINHITS 18PIN 6
v$sesstat 2
1 5
CURSOR_SPACE_FOR_TIME
1. 1
1. alter system set cursor_space_for_time=true scope=spfile;
2. shutdown immediate; --
3. Startup;
2. 2
select * from aa_1;
3. 1
select kglhdadr,kglhdpar,kglhdlmd,kglhdpmd,kglobhs0,kglobhs6,
kglobhs0+kglobhs1+kglobhs2+kglobhs3+kglobhs4+kglobhs5+kglobhs6 MEM
from x$kglob where kglnaobj like 'select * from aa_1';
KGLHDADR KGLHDPAR KGLHDLMD KGLHDPMD KGLOBHS0 KGLOBHS6 MEM
-------- -------- ---------- ---------- ---------- ---------- ------------------ -------- ---------- ---------- ---------- ---------- -------79E019D8 79E01EF4
1
2 <----
1632
1948
3580
79E01EF4 79E01EF4
1
0
1436
0
1436
PIN
4. 3
select namespace, gets, gethits, pins, pinhits from v$librarycache where namespace = 'SQL AREA';
sys@MYTWO> select namespace, gets, gethits, pins, pinhits from v$librarycache where namespace = 'SQL AREA';
NAMESPACE
GETS GETHITS PINS PINHITS
--------------- ---------- ---------- ---------- ------------------------- ---------- ---------- ---------- ---------SQL AREA
457
359
1487
1268
5. 2
Select * from aa_1;
6. 3
sys@MYTWO> select namespace, gets, gethits, pins, pinhits from v$librarycache where namespace = 'SQL AREA';
NAMESPACE
GETS GETHITS PINS PINHITS
--------------- ---------- ---------- ---------- ------------------------- ---------- ---------- ---------- ---------SQL AREA
459
361
1491
1272
456 CURSOR_SPACE_FOR_TIME TRUE 2 select * from aa_1
GETS 1PINS 2
CURSOR_SPACE_FOR_TIME Oracle
v$librarycache 456
v$sesstat 2 0 1
15
2. SESSION_CACHED_CURSORS
3 PGA Oracle LRU
SESSION SYSTEM
1.
SQL 1 3
V$SQL.executions
16
1. A session_cached_cursors
alter session set session_cached_cursors=10;
2. Session_cached_cursors SQL
select * from t4_1 where id=2;
sys@MYTWO> select substr(sql_text,1,30),executions from v$sql where sql_text like 'select * from t4_1 where %';
SUBSTR(SQL_TEXT,1,30)
EXECUTIONS
------------------------------------------------------------ ---------select * from t4_1 where id=2
2
3. A
select * from t4_1 where id=2;
sys@MYTWO> select substr(sql_text,1,30),executions from v$sql where sql_text like 'select * from t4_1 where %';
SUBSTR(SQL_TEXT,1,30)
EXECUTIONS
------------------------------------------------------------ ---------select * from t4_1 where id=2
3
SQL*PLUS A
select * from aa_1;
STATISTIC# NAME
VALUE
---------- ---------------------------------------------------------------- ---------205 session cursor cache hits
0
206 session cursor cache count
1
16
2.
LOCK PIN 0
- 17 -
LOCK NULL
sys@MYTWO> select kglhdadr,kglhdpar,kglhdlmd,kglhdpmd,kglobhs0,kglobhs6,
kglobhs0+kglobhs1+kglobhs2+kglobhs3+kglobhs4+kglobhs5+kglobhs6 MEM
from x$kglob where kglnaobj like 'select * from t4_1 where id=2%';
KGLHDADR KGLHDPAR KGLHDLMD KGLHDPMD KGLOBHS0 KGLOBHS6
MEM
-------- -------- ---------- ---------- ---------- ---------- ---------79DB8FA8 79DBA3C4
1
0
1920
6380
8300
79DBA3C4 79DBA3C4
1
0
1243
0
1243
v$open_cursor Oracle
NULL NULL
Oracle
Oracle LRU
3.
softer parse
PGA
Library cache HASH
V$LIBRARCACHE
17 V$LIBRARCACHE
1. B
select namespace, gets, gethits, pins, pinhits from v$librarycache where namespace = 'SQL AREA' ;
sys@MYTWO> select namespace, gets, gethits, pins, pinhits from v$librarycache where namespace = 'SQL AREA' ;
NAMESPACE
GETS GETHITS
PINS PINHITS
--------------- ---------- ---------- ---------- ---------SQL AREA
4856
2715 10662
6292
sys@MYTWO> select namespace, gets, gethits, pins, pinhits from v$librarycache where namespace = 'SQL AREA' ;
NAMESPACE
GETS GETHITS
PINS PINHITS
--------------- ---------- ---------- ---------- ---------SQL AREA
4859
2715 10662
6292
sys@MYTWO> select namespace, gets, gethits, pins, pinhits from v$librarycache where namespace = 'SQL AREA' ;
NAMESPACE
GETS GETHITS
PINS PINHITS
--------------- ---------- ---------- ---------- ---------SQL AREA
4860
2716 10664
6294
GETSPINS GETS 1PINS 2
2. A
select * from t4_1 where id=2
3. B GETSPINS
sys@MYTWO> select namespace, gets, gethits, pins, pinhits from v$librarycache where namespace = 'SQL AREA' ;
NAMESPACE
GETS GETHITS
PINS PINHITS
--------------- ---------- ---------- ---------- ---------SQL AREA
4861
2717 10667
6297
GETS 1select * from t4_1 where id=2
GETS PINS 1 PINS PIN
6
PINS
CURSOR_SPACE_FOR_TIME GETS
PINS 2 PGA Library cache
PIN
- 18 -
17
1
PGA
1. A
scott@MYTWO> set autotrace traceonly
scott@MYTWO> select * from aa_1;
Execution Plan
---------------------------------------------------------0 SELECT STATEMENT Optimizer=CHOOSE
1 0 TABLE ACCESS (FULL) OF 'AA_1'
Statistics
---------------------------------------------------------176 recursive calls
0 db block gets
22 consistent gets
1 physical reads
0 redo size
215 bytes sent via SQL*Net to client
372 bytes received via SQL*Net from client
1 SQL*Net roundtrips to/from client
2 sorts (memory)
0 sorts (disk)
0 rows processed
176
2. B 1 Library cache
sys@MYTWO> select kglhdadr,kglhdpar,kglhdlmd,kglhdpmd,kglobhs0,kglobhs6,
kglobhs0+kglobhs1+kglobhs2+kglobhs3+kglobhs4+kglobhs5+kglobhs6 MEM
from x$kglob where kglnaobj like 'select * from aa_1%';
KGLHDADR KGLHDPAR KGLHDLMD KGLHDPMD KGLOBHS0 KGLOBHS6 MEM
-------- -------- ---------- ---------- ---------- ---------- ------------------ -------- ---------- ---------- ---------- ---------- -------79DD5DE0 79DD71FC
0
0
1784
1948
3732
79DD71FC 79DD71FC
0
0
1768
0
1768
6 1948
3. C
declare
msql varchar2(500);
mcur number;
mstat number;
jg varchar2(4000);
cg number;
begin
mcur:=dbms_sql.open_cursor;
for i in 1..2000 loop
msql:='select myid from t4 where myid='||to_char(i);
dbms_sql.parse(mcur,msql,dbms_sql.native);
dbms_sql.define_column(mcur,1,jg,4000);
mstat:=dbms_sql.execute(mcur);
- 19 -
cg:=dbms_sql.fetch_rows(mcur);
dbms_sql.column_value(mcur,1,jg);
dbms_output.put_line(':'||jg);
end loop;
dbms_sql.close_cursor(mcur);
end;
/
2000 1 alter
system flush shared_pool
2000 T4
4. B 1 Library cache
sys@MYTWO> select kglhdad
1
5. A
scott@MYTWO> select * from aa_1;
Execution Plan
---------------------------------------------------------0 SELECT STATEMENT Optimizer=CHOOSE
1 0 TABLE ACCESS (FULL) OF 'AA_1'
Statistics
---------------------------------------------------------132 recursive calls
0 db block gets
16 consistent gets
0 physical reads
0 redo size
215 bytes sent via SQL*Net to client
372 bytes received via SQL*Net from client
1 SQL*Net roundtrips to/from client
2 sorts (memory)
0 sorts (disk)
0 rows processed
132 A PGA
PGA
cursor_space_for_time FALSE
session_cached_cursors
2
- 20 -