2026-03-12 20:23:15
This commit is contained in:
123
tpt/tools/collectors/latchprof_install.sql
Normal file
123
tpt/tools/collectors/latchprof_install.sql
Normal file
@@ -0,0 +1,123 @@
|
||||
-- Copyright 2018 Tanel Poder. All rights reserved. More info at http://tanelpoder.com
|
||||
-- Licensed under the Apache License, Version 2.0. See LICENSE.txt for terms & conditions.
|
||||
|
||||
-- LatchProfX collector v2.0 by Tanel Poder (blog.tanelpoder.com)
|
||||
|
||||
-- drop table latchprof_reasons;
|
||||
|
||||
create table latchprof_reasons (
|
||||
indx number not null
|
||||
, reason_name varchar2(200) not null
|
||||
, reason_label varchar2(200)
|
||||
, primary key (indx)
|
||||
)
|
||||
organization index
|
||||
tablespace users
|
||||
/
|
||||
|
||||
insert into latchprof_reasons (indx,reason_name,reason_label)
|
||||
select indx, ksllwnam, ksllwlbl
|
||||
from x$ksllw
|
||||
/
|
||||
|
||||
commit;
|
||||
|
||||
--drop table latchprof_history;
|
||||
|
||||
create table latchprof_history
|
||||
tablespace users
|
||||
as
|
||||
select
|
||||
systimestamp sample_timestamp
|
||||
, lh.ksuprpid pid
|
||||
, lh.ksuprsid sid
|
||||
, lh.ksuprlat child_address
|
||||
, lh.ksuprlnm latch_name
|
||||
, lh.ksuprlmd hold_mode
|
||||
, lh.ksulawhr where_location
|
||||
, lh.ksulawhy which_object
|
||||
, s.ksusesqh sqlhash
|
||||
, s.ksusesql sqladdr
|
||||
, s.ksusesph planhash
|
||||
, s.ksusesch sqlchild
|
||||
, s.ksusesqi sqlid
|
||||
from
|
||||
x$ksuprlat lh
|
||||
, x$ksuse s
|
||||
where
|
||||
lh.ksuprsid = s.indx
|
||||
and 1=0
|
||||
/
|
||||
|
||||
|
||||
create or replace package latchprof as
|
||||
procedure snap_latchholder(p_sleep in number default 1);
|
||||
end latchprof;
|
||||
/
|
||||
show err
|
||||
|
||||
create or replace package body latchprof as
|
||||
|
||||
procedure snap_latchholder(p_sleep in number default 1) as
|
||||
begin
|
||||
|
||||
while true loop
|
||||
|
||||
insert into latchprof_history
|
||||
select /*+ LEADING(lh) USE_NL(s) LATCHPROF_INSERT */
|
||||
systimestamp sample_timestamp
|
||||
, lh.ksuprpid pid
|
||||
, lh.ksuprsid sid
|
||||
, lh.ksuprlat child_address
|
||||
, lh.ksuprlnm latch_name
|
||||
, lh.ksuprlmd hold_mode
|
||||
, lh.ksulawhr where_location
|
||||
, lh.ksulawhy which_object
|
||||
, s.ksusesqh sqlhash
|
||||
, s.ksusesql sqladdr
|
||||
, s.ksusesph planhash
|
||||
, s.ksusesch sqlchild
|
||||
, s.ksusesqi sqlid
|
||||
from
|
||||
x$ksuprlat lh
|
||||
, x$ksuse s
|
||||
where
|
||||
lh.ksuprsid = s.indx
|
||||
;
|
||||
commit;
|
||||
|
||||
dbms_lock.sleep(p_sleep);
|
||||
|
||||
end loop; -- while true
|
||||
|
||||
end snap_latchholder;
|
||||
|
||||
end latchprof;
|
||||
/
|
||||
show err
|
||||
|
||||
-- 9i version
|
||||
create or replace view latchprof_view as
|
||||
select
|
||||
h.sample_timestamp
|
||||
, h.pid
|
||||
, h.sid
|
||||
, h.child_address
|
||||
, h.latch_name
|
||||
, h.hold_mode
|
||||
, h.where_location
|
||||
, h.which_object
|
||||
, h.sqlid
|
||||
, h.sqlchild
|
||||
, h.planhash
|
||||
, h.sqlhash
|
||||
, h.sqladdr
|
||||
, r.reason_name
|
||||
, r.reason_label
|
||||
from
|
||||
latchprof_history h
|
||||
, latchprof_reasons r
|
||||
where
|
||||
h.where_location = r.indx
|
||||
/
|
||||
|
||||
58
tpt/tools/collectors/mutexprof_install.sql
Normal file
58
tpt/tools/collectors/mutexprof_install.sql
Normal file
@@ -0,0 +1,58 @@
|
||||
-- Copyright 2018 Tanel Poder. All rights reserved. More info at http://tanelpoder.com
|
||||
-- Licensed under the Apache License, Version 2.0. See LICENSE.txt for terms & conditions.
|
||||
|
||||
drop table mutexprof_history;
|
||||
|
||||
create table mutexprof_history
|
||||
tablespace users
|
||||
as
|
||||
select
|
||||
*
|
||||
from
|
||||
x$mutex_sleep_history
|
||||
where
|
||||
1=0
|
||||
/
|
||||
|
||||
create or replace package mutexprof as
|
||||
procedure snap_mutex_sleeps(p_sleep in number default 1);
|
||||
end mutexprof;
|
||||
/
|
||||
show err
|
||||
|
||||
create or replace package body mutexprof as
|
||||
|
||||
procedure snap_mutex_sleeps(p_sleep in number default 1) as
|
||||
lv_max_sleep_timestamp timestamp := systimestamp;
|
||||
type typ is table of x$mutex_sleep_history%rowtype;
|
||||
t typ;
|
||||
begin
|
||||
|
||||
while true loop
|
||||
|
||||
select * bulk collect into t
|
||||
from x$mutex_sleep_history
|
||||
where sleep_timestamp > lv_max_sleep_timestamp;
|
||||
|
||||
-- get max timestamp so next time we can ignore these rows
|
||||
for r in 1 .. t.count loop
|
||||
if t(r).sleep_timestamp > lv_max_sleep_timestamp then
|
||||
lv_max_sleep_timestamp := t(r).sleep_timestamp;
|
||||
end if;
|
||||
end loop;
|
||||
|
||||
-- insert
|
||||
forall r in 1 .. t.count
|
||||
insert into mutexprof_history values t(r);
|
||||
|
||||
commit;
|
||||
dbms_lock.sleep(p_sleep);
|
||||
|
||||
end loop; -- while true
|
||||
|
||||
end snap_mutex_sleeps;
|
||||
|
||||
end mutexprof;
|
||||
/
|
||||
show err
|
||||
|
||||
109
tpt/tools/collectors/plancap_collector.sql
Normal file
109
tpt/tools/collectors/plancap_collector.sql
Normal file
@@ -0,0 +1,109 @@
|
||||
-- Copyright 2018 Tanel Poder. All rights reserved. More info at http://tanelpoder.com
|
||||
-- Licensed under the Apache License, Version 2.0. See LICENSE.txt for terms & conditions.
|
||||
|
||||
CREATE OR REPLACE PACKAGE plancap_collector AS
|
||||
|
||||
PROCEDURE snap_data_files;
|
||||
PROCEDURE snap_free_space;
|
||||
PROCEDURE snap_segment_space;
|
||||
PROCEDURE snap_service_stats;
|
||||
|
||||
END plancap_collector;
|
||||
/
|
||||
|
||||
CREATE OR REPLACE PACKAGE BODY plancap_collector AS
|
||||
|
||||
PROCEDURE snap_data_files AS
|
||||
BEGIN
|
||||
INSERT INTO plancap$data_files
|
||||
SELECT
|
||||
sysdate
|
||||
, tablespace_name
|
||||
, file_id
|
||||
, SUM(bytes)
|
||||
, SUM(blocks)
|
||||
, relative_fno
|
||||
FROM
|
||||
dba_data_files
|
||||
GROUP BY
|
||||
sysdate, tablespace_name, file_id, relative_fno;
|
||||
COMMIT;
|
||||
END snap_data_files;
|
||||
|
||||
PROCEDURE snap_free_space AS
|
||||
BEGIN
|
||||
INSERT INTO plancap$free_space
|
||||
SELECT
|
||||
sysdate
|
||||
, tablespace_name
|
||||
, file_id
|
||||
, SUM(bytes)
|
||||
, SUM(blocks)
|
||||
, relative_fno
|
||||
FROM
|
||||
dba_free_space
|
||||
GROUP BY
|
||||
sysdate, tablespace_name, file_id, relative_fno;
|
||||
COMMIT;
|
||||
END snap_free_space;
|
||||
|
||||
PROCEDURE snap_segment_space AS
|
||||
BEGIN
|
||||
INSERT INTO plancap$segment_space
|
||||
SELECT
|
||||
sysdate
|
||||
, owner
|
||||
, segment_name
|
||||
, NVL(partition_name,'-') partition_name
|
||||
, segment_type
|
||||
, tablespace_name
|
||||
, SUM(bytes) bytes
|
||||
, SUM(blocks) blocks
|
||||
, SUM(extents) extents
|
||||
FROM
|
||||
dba_segments
|
||||
GROUP BY
|
||||
sysdate, owner, segment_name, NVL(partition_name,'-'), tablespace_name, segment_type;
|
||||
COMMIT;
|
||||
END snap_segment_space;
|
||||
|
||||
|
||||
PROCEDURE snap_service_stats AS
|
||||
BEGIN
|
||||
INSERT INTO plancap$service_stats
|
||||
WITH sq AS (
|
||||
SELECT service_name,stat_name,value FROM v$service_stats
|
||||
)
|
||||
SELECT
|
||||
sysdate
|
||||
, a.service_name
|
||||
, a.value DB_CPU
|
||||
, b.value EXECUTE_COUNT
|
||||
, c.value USER_COMMITS
|
||||
, d.value USER_CALLS
|
||||
FROM
|
||||
sq a
|
||||
, sq b
|
||||
, sq c
|
||||
, sq d
|
||||
WHERE
|
||||
a.service_name = b.service_name
|
||||
AND b.service_name = c.service_name
|
||||
AND c.service_name = d.service_name
|
||||
AND a.stat_name = 'DB CPU'
|
||||
AND b.stat_name = 'execute count'
|
||||
AND c.stat_name = 'user commits'
|
||||
AND d.stat_name = 'user calls';
|
||||
COMMIT;
|
||||
END;
|
||||
|
||||
|
||||
END plancap_collector;
|
||||
/
|
||||
|
||||
SHOW ERR
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
67
tpt/tools/collectors/plancap_collector_schema.sql
Normal file
67
tpt/tools/collectors/plancap_collector_schema.sql
Normal file
@@ -0,0 +1,67 @@
|
||||
-- Copyright 2018 Tanel Poder. All rights reserved. More info at http://tanelpoder.com
|
||||
-- Licensed under the Apache License, Version 2.0. See LICENSE.txt for terms & conditions.
|
||||
|
||||
-- drop table plancap$data_files;
|
||||
-- drop table plancap$free_space;
|
||||
-- drop table plancap$segment_space;
|
||||
|
||||
CREATE TABLE plancap$data_files (
|
||||
snap_time DATE NOT NULL
|
||||
, tablespace_name VARCHAR2(100) NOT NULL
|
||||
, file_id NUMBER NOT NULL
|
||||
, bytes NUMBER NOT NULL
|
||||
, blocks NUMBER NOT NULL
|
||||
, relative_fno NUMBER NOT NULL
|
||||
);
|
||||
|
||||
ALTER TABLE plancap$data_files ADD CONSTRAINT pk_data_files
|
||||
PRIMARY KEY (snap_time,tablespace_name,file_id);
|
||||
|
||||
CREATE TABLE plancap$free_space (
|
||||
snap_time DATE NOT NULL
|
||||
, tablespace_name VARCHAR2(100) NOT NULL
|
||||
, file_id NUMBER NOT NULL
|
||||
, bytes NUMBER NOT NULL
|
||||
, blocks NUMBER NOT NULL
|
||||
, relative_fno NUMBER NOT NULL
|
||||
);
|
||||
|
||||
ALTER TABLE plancap$free_space ADD CONSTRAINT pk_free_space
|
||||
PRIMARY KEY (snap_time,tablespace_name,file_id);
|
||||
|
||||
|
||||
CREATE TABLE plancap$segment_space(
|
||||
snap_time DATE NOT NULL
|
||||
, owner VARCHAR2(100) NOT NULL
|
||||
, segment_name VARCHAR2(100) NOT NULL
|
||||
, partition_name VARCHAR2(100) NOT NULL
|
||||
, segment_type VARCHAR2(100) NOT NULL
|
||||
, tablespace_name VARCHAR2(100) NOT NULL
|
||||
, bytes NUMBER NOT NULL
|
||||
, blocks NUMBER NOT NULL
|
||||
, extents NUMBER NOT NULL
|
||||
);
|
||||
|
||||
ALTER TABLE plancap$segment_space ADD CONSTRAINT pk_segment_space
|
||||
PRIMARY KEY (snap_time,owner,segment_name,partition_name,segment_type);
|
||||
|
||||
CREATE TABLE plancap$service_stats (
|
||||
snap_time DATE NOT NULL
|
||||
, service_name VARCHAR2(100) NOT NULL
|
||||
, db_cpu NUMBER NOT NULL
|
||||
, execute_count NUMBER NOT NULL
|
||||
, user_commits NUMBER NOT NULL
|
||||
, user_calls NUMBER NOT NULL
|
||||
);
|
||||
|
||||
ALTER TABLE plancap$service_stats ADD CONSTRAINT pk_service_stats
|
||||
PRIMARY KEY (snap_time,service_name);
|
||||
|
||||
|
||||
CREATE PUBLIC SYNONYM plancap$data_files FOR plancap$data_files;
|
||||
CREATE PUBLIC SYNONYM plancap$free_space FOR plancap$free_space;
|
||||
CREATE PUBLIC SYNONYM plancap$segment_space FOR plancap$segment_space;
|
||||
|
||||
GRANT SELECT ON plancap$data_files to DBA;
|
||||
GRANT SELECT ON plancap$free_space to DBA;
|
||||
GRANT SELECT ON plancap$segment_space to DBA;
|
||||
@@ -0,0 +1,58 @@
|
||||
-- Copyright 2018 Tanel Poder. All rights reserved. More info at http://tanelpoder.com
|
||||
-- Licensed under the Apache License, Version 2.0. See LICENSE.txt for terms & conditions.
|
||||
|
||||
-- select * from v$shared_pool_reserved;
|
||||
--CREATE TABLE tanel_ksmspr TABLESPACE USERS AS SELECT * FROM sys.x$ksmspr;
|
||||
--CREATE TABLE tanel_kglob STORAGE (INITIAL 10M NEXT 10M PCTINCREASE 0) TABLESPACE users AS SELECT * FROM sys.x$kglob;
|
||||
|
||||
SELECT
|
||||
l.kglnaown owner
|
||||
, l.kglnaobj object_name
|
||||
, l.kglnahsh hash_value
|
||||
, decode(l.kglhdnsp,0,'CURSOR',1,'TABLE/PROCEDURE',2,'BODY',3,'TRIGGER', 4,'INDEX',5,'CLUSTER',6,'OBJECT',
|
||||
13,'JAVA SOURCE',14,'JAVA RESOURCE', 15,'REPLICATED TABLE OBJECT',
|
||||
16,'REPLICATION INTERNAL PACKAGE',
|
||||
17,'CONTEXT
|
||||
POLICY',18,'PUB_SUB',19,'SUMMARY',20,'DIMENSION', 21,'APP CONTEXT',22,'STORED OUTLINE'
|
||||
,23,'RULESET',24,'RSRC PLAN',
|
||||
25,'RSRC CONSUMER GROUP',26,'PENDING RSRC PLAN',27,'PENDING RSRC CONSUMER GROUP',
|
||||
28,'SUBSCRIPTION',29,'LOCATION',30,'REMOTE OBJECT',
|
||||
31,'SNAPSHOT METADATA',32,'JAVA SHARED DATA',33,'SECURITY PROFILE', 'INVALID NAMESPACE') obj_namespace
|
||||
, decode(bitand(l.kglobflg,3),0,'NOT LOADED',2,'NON-EXISTENT',3,'INVALID STATUS',
|
||||
decode(kglobtyp, 0,'CURSOR',1,'INDEX',2,'TABLE',3,'CLUSTER',4,'VIEW',
|
||||
5,'SYNONYM',6,'SEQUENCE',7,'PROCEDURE',8,'FUNCTION',9,'PACKAGE',10, 'NON-EXISTENT',
|
||||
11,'PACKAGE BODY',12,'TRIGGER',13,'TYPE',14,'TYPE BODY',
|
||||
15,'OBJECT',16,'USER',17,'DBLINK',18,'PIPE',19,'TABLE PARTITION'
|
||||
, 20,'INDEX PARTITION',21,'LOB',22,'LIBRARY',23,'DIRECTORY',24,'QUEUE',
|
||||
25,'INDEX-ORGANIZED TABLE',26,'REPLICATION OBJECT GROUP',
|
||||
27,'REPLICATION PROPAGATOR', 28,'JAVA SOURCE',29,'JAVA CLASS',30,'JAVA RESOURCE'
|
||||
,31,'JAVA JAR', 32,'INDEX TYPE',33,
|
||||
'OPERATOR',34,'TABLE SUBPARTITION',35,'INDEX SUBPARTITION',
|
||||
36, 'REPLICATED TABLE OBJECT',37,'REPLICATION INTERNAL PACKAGE', 38,'CONTEXT POLICY'
|
||||
,39,'PUB_SUB',40,'LOB PARTITION',41,'LOB SUBPARTITION', 42,'SUMMARY',43,'DIMENSION'
|
||||
,44,'APP CONTEXT',45,'STORED OUTLINE',46,'RULESET', 47,'RSRC PLAN',
|
||||
48,'RSRC CONSUMER GROUP',49,'PENDING RSRC PLAN', 50,'PENDING RSRC CONSUMER GROUP'
|
||||
,51,'SUBSCRIPTION',52,'LOCATION', 53,'REMOTE OBJECT',54,'SNAPSHOT METADATA',55,'IFS'
|
||||
, 56,'JAVA SHARED DATA',57,'SECURITY PROFILE','INVALID TYPE')) obj_type
|
||||
, s.ksmchptr
|
||||
, s.ksmchsiz
|
||||
, s.ksmchcls
|
||||
, s.ksmchcom
|
||||
, s.ksmchpar
|
||||
FROM
|
||||
tanel_ksmspr s
|
||||
, tanel_kglob l
|
||||
-- x$ksmspr s
|
||||
--, x$kglob l
|
||||
WHERE
|
||||
s.ksmchptr = l.kglobhd0
|
||||
OR s.ksmchptr = l.kglobhd1
|
||||
OR s.ksmchptr = l.kglobhd2
|
||||
OR s.ksmchptr = l.kglobhd3
|
||||
OR s.ksmchptr = l.kglobhd4
|
||||
OR s.ksmchptr = l.kglobhd5
|
||||
OR s.ksmchptr = l.kglobhd6
|
||||
OR s.ksmchptr = l.kglobhd7
|
||||
ORDER BY
|
||||
s.ksmchsiz
|
||||
/
|
||||
@@ -0,0 +1,204 @@
|
||||
-- Copyright 2018 Tanel Poder. All rights reserved. More info at http://tanelpoder.com
|
||||
-- Licensed under the Apache License, Version 2.0. See LICENSE.txt for terms & conditions.
|
||||
|
||||
-- monitor shared pool activity, free memory and chunk flushing
|
||||
--
|
||||
-- USAGE:
|
||||
-- exec shared_pool_monitor.get_all( <sampling_interval>, <how_many_samples )
|
||||
--
|
||||
-- exec shared_pool_monitor.get_all -- this will sample every 10 minutes, forever
|
||||
|
||||
|
||||
CREATE OR REPLACE PACKAGE shared_pool_monitor AS
|
||||
PROCEDURE get_subpool_stats (p_date IN DATE DEFAULT SYSDATE);
|
||||
PROCEDURE get_flush_stats (p_date IN DATE DEFAULT SYSDATE);
|
||||
PROCEDURE get_heap_activity_stats (p_date IN DATE DEFAULT SYSDATE);
|
||||
PROCEDURE get_reserved_chunk_stats (p_date IN DATE DEFAULT SYSDATE);
|
||||
PROCEDURE get_reserved_chunk_details (p_date IN DATE DEFAULT SYSDATE);
|
||||
PROCEDURE get_all (p_sleep IN NUMBER DEFAULT 600, p_times IN NUMBER DEFAULT 0);
|
||||
END shared_pool_monitor;
|
||||
/
|
||||
SHOW ERR
|
||||
|
||||
CREATE OR REPLACE PACKAGE BODY shared_pool_monitor AS
|
||||
|
||||
PROCEDURE get_subpool_stats(p_date IN DATE DEFAULT SYSDATE) AS
|
||||
BEGIN
|
||||
DBMS_APPLICATION_INFO.SET_ACTION('GET_SUBPOOL_STATS:BEGIN');
|
||||
|
||||
INSERT INTO spmon_subpool_stats (sample_time,subpool,name,bytes)
|
||||
SELECT
|
||||
SYSDATE
|
||||
, ksmdsidx
|
||||
, ksmssnam
|
||||
, SUM(ksmsslen)
|
||||
FROM
|
||||
x$ksmss
|
||||
WHERE
|
||||
ksmsslen > 0
|
||||
AND ksmdsidx > 0
|
||||
GROUP BY
|
||||
SYSDATE
|
||||
, ksmdsidx
|
||||
, ksmssnam;
|
||||
|
||||
COMMIT;
|
||||
|
||||
DBMS_APPLICATION_INFO.SET_ACTION('GET_SUBPOOL_STATS:END');
|
||||
END get_subpool_stats;
|
||||
|
||||
PROCEDURE get_flush_stats(p_date IN DATE DEFAULT SYSDATE) AS
|
||||
BEGIN
|
||||
DBMS_APPLICATION_INFO.SET_ACTION('GET_FLUSH_STATS:BEGIN');
|
||||
|
||||
-- this procedure relies on the fact that X$KSMLRU contents are cleared out
|
||||
-- automatically every time it's queried
|
||||
INSERT INTO spmon_flush_stats ( sample_time, addr, indx, inst_id, chunk_subpool
|
||||
, chunk_duration, chunk_comment , chunk_size
|
||||
, chunks_flushed_out , flusher_object_name
|
||||
, flusher_hash_value , flusher_ses_addr )
|
||||
SELECT
|
||||
p_date sample_time
|
||||
, ADDR
|
||||
, INDX
|
||||
, INST_ID
|
||||
, KSMLRIDX
|
||||
, KSMLRDUR
|
||||
, KSMLRCOM
|
||||
, KSMLRSIZ
|
||||
, KSMLRNUM
|
||||
, KSMLRHON
|
||||
, KSMLROHV
|
||||
, KSMLRSES
|
||||
FROM
|
||||
x$ksmlru
|
||||
WHERE
|
||||
ksmlrnum > 0;
|
||||
|
||||
COMMIT;
|
||||
|
||||
DBMS_APPLICATION_INFO.SET_ACTION('GET_FLUSH_STATS:END');
|
||||
END get_flush_stats;
|
||||
|
||||
PROCEDURE get_heap_activity_stats(p_date IN DATE DEFAULT SYSDATE) AS
|
||||
BEGIN
|
||||
DBMS_APPLICATION_INFO.SET_ACTION('GET_HEAP_ACTIVITY_STATS:BEGIN');
|
||||
|
||||
INSERT INTO spmon_heap_activity_stats
|
||||
SELECT
|
||||
p_date
|
||||
, kghluidx
|
||||
, kghludur
|
||||
, kghlufsh
|
||||
, kghluops
|
||||
, kghlurcr
|
||||
, kghlutrn
|
||||
, kghlunfu
|
||||
, kghlunfs
|
||||
, kghlumxa
|
||||
, kghlumes
|
||||
, kghlumer
|
||||
, kghlurcn
|
||||
, kghlurmi
|
||||
, kghlurmz
|
||||
, kghlurmx
|
||||
FROM
|
||||
x$kghlu;
|
||||
COMMIT;
|
||||
|
||||
DBMS_APPLICATION_INFO.SET_ACTION('GET_HEAP_ACTIVITY_STATS:END');
|
||||
END get_heap_activity_stats;
|
||||
|
||||
PROCEDURE get_reserved_chunk_details(p_date IN DATE DEFAULT SYSDATE) AS
|
||||
BEGIN
|
||||
DBMS_APPLICATION_INFO.SET_ACTION('GET_RESERVED_CHUNKS:BEGIN');
|
||||
INSERT INTO spmon_reserved_chunk_details
|
||||
SELECT
|
||||
p_date
|
||||
, ADDR
|
||||
, INDX
|
||||
, INST_ID
|
||||
, KSMCHCOM
|
||||
, KSMCHPTR
|
||||
, KSMCHSIZ
|
||||
, KSMCHCLS
|
||||
, KSMCHTYP
|
||||
, KSMCHPAR
|
||||
FROM
|
||||
x$ksmspr -- important, this view must be x$ksmspR <-- (not the x$ksmsp which may hang your instance)
|
||||
;
|
||||
COMMIT;
|
||||
DBMS_APPLICATION_INFO.SET_ACTION('GET_RESERVED_CHUNKS:END');
|
||||
END get_reserved_chunk_details;
|
||||
|
||||
|
||||
PROCEDURE get_reserved_chunk_stats(p_date IN DATE DEFAULT SYSDATE) AS
|
||||
BEGIN
|
||||
DBMS_APPLICATION_INFO.SET_ACTION('GET_RESERVED_CHUNKS:BEGIN');
|
||||
INSERT INTO spmon_reserved_chunk_stats
|
||||
SELECT
|
||||
p_date
|
||||
, KSMCHCLS
|
||||
, KSMCHCOM
|
||||
, KSMCHTYP
|
||||
, COUNT(*)
|
||||
, SUM(KSMCHSIZ)
|
||||
, AVG(KSMCHSIZ)
|
||||
, MIN(KSMCHSIZ)
|
||||
, MAX(KSMCHSIZ)
|
||||
FROM
|
||||
x$ksmspr -- important, this view must be x$ksmspR <-- (not the x$ksmsp which may hang your instance)
|
||||
GROUP BY
|
||||
p_date
|
||||
, ksmchcls
|
||||
, ksmchcom
|
||||
, ksmchtyp;
|
||||
|
||||
COMMIT;
|
||||
DBMS_APPLICATION_INFO.SET_ACTION('GET_RESERVED_CHUNKS:END');
|
||||
END get_reserved_chunk_stats;
|
||||
|
||||
|
||||
|
||||
PROCEDURE get_all(p_sleep IN NUMBER DEFAULT 600, p_times IN NUMBER DEFAULT 0) AS
|
||||
cur_date DATE;
|
||||
BEGIN
|
||||
|
||||
IF p_times > 0 THEN -- sample x times
|
||||
FOR i IN 1..p_times LOOP
|
||||
cur_date := SYSDATE;
|
||||
|
||||
get_subpool_stats(cur_date);
|
||||
get_heap_activity_stats(cur_date);
|
||||
get_flush_stats(cur_date);
|
||||
get_reserved_chunk_stats(cur_date);
|
||||
|
||||
DBMS_APPLICATION_INFO.SET_ACTION('MAIN LOOP:SLEEPING');
|
||||
DBMS_LOCK.SLEEP(p_sleep);
|
||||
END LOOP; -- 1..p_times
|
||||
ELSE -- sample forever
|
||||
WHILE TRUE LOOP
|
||||
cur_date := SYSDATE;
|
||||
|
||||
get_subpool_stats(cur_date);
|
||||
get_heap_activity_stats(cur_date);
|
||||
get_flush_stats(cur_date);
|
||||
get_reserved_chunk_stats(cur_date);
|
||||
|
||||
DBMS_APPLICATION_INFO.SET_ACTION('MAIN LOOP:SLEEPING');
|
||||
DBMS_LOCK.SLEEP(p_sleep);
|
||||
END LOOP; -- while true
|
||||
END IF; -- p_times > 0
|
||||
|
||||
END get_all;
|
||||
|
||||
BEGIN
|
||||
DBMS_APPLICATION_INFO.SET_MODULE('SHARED POOL MONITOR', 'PACKAGE INITIALIZATION');
|
||||
|
||||
END shared_pool_monitor;
|
||||
/
|
||||
|
||||
SHOW ERR
|
||||
|
||||
GRANT EXECUTE ON shared_pool_monitor TO perfstat;
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
-- Copyright 2018 Tanel Poder. All rights reserved. More info at http://tanelpoder.com
|
||||
-- Licensed under the Apache License, Version 2.0. See LICENSE.txt for terms & conditions.
|
||||
|
||||
SELECT
|
||||
SAMPLE_TIME
|
||||
, SUBPOOL
|
||||
, DURATION
|
||||
, FLUSHED_CHUNKS_D
|
||||
, LRU_OPERATIONS_D
|
||||
, RESERVED_SCANS
|
||||
, RESERVED_MISSES
|
||||
, UNSUCCESSFUL_FLUSHES
|
||||
, LAST_UNSUCC_MISS_REQ_SIZE
|
||||
, LAST_UNSUCC_FLUSH_REQ_SIZE
|
||||
FROM
|
||||
sys.SPMON_HEAP_ACTIVITY_VIEW
|
||||
WHERE
|
||||
sample_time BETWEEN %FROM_DATE% AND %TO_DATE%
|
||||
|
||||
@@ -0,0 +1,124 @@
|
||||
-- Copyright 2018 Tanel Poder. All rights reserved. More info at http://tanelpoder.com
|
||||
-- Licensed under the Apache License, Version 2.0. See LICENSE.txt for terms & conditions.
|
||||
|
||||
-- change to whichever tablespace you want to create these tables in
|
||||
DEF tablespace=TOOLS
|
||||
|
||||
-- x$ksmss (v$sgastat)
|
||||
CREATE TABLE spmon_subpool_stats (
|
||||
sample_time DATE
|
||||
, subpool NUMBER
|
||||
, name VARCHAR2(100)
|
||||
, bytes NUMBER
|
||||
)
|
||||
TABLESPACE &tablespace STORAGE (INITIAL 1M NEXT 10M PCTINCREASE 0);
|
||||
|
||||
-- x$ksmlru
|
||||
CREATE TABLE spmon_flush_stats (
|
||||
sample_time DATE
|
||||
, addr RAW(8)
|
||||
, indx NUMBER
|
||||
, inst_id NUMBER
|
||||
, chunk_subpool NUMBER
|
||||
, chunk_duration NUMBER
|
||||
, chunk_comment VARCHAR2(100)
|
||||
, chunk_size NUMBER
|
||||
, chunks_flushed_out NUMBER
|
||||
, flusher_object_name VARCHAR2(100)
|
||||
, flusher_hash_value NUMBER
|
||||
, flusher_ses_addr RAW(8)
|
||||
)
|
||||
TABLESPACE &tablespace STORAGE (INITIAL 1M NEXT 10M PCTINCREASE 0);
|
||||
|
||||
-- x$kghlu (part of v$shared_pool_reserved)
|
||||
CREATE TABLE spmon_heap_activity_stats (
|
||||
sample_time DATE
|
||||
, kghluidx NUMBER -- subpool id
|
||||
, kghludur NUMBER -- allocation duration class
|
||||
, kghlufsh NUMBER -- chunks flushed
|
||||
, kghluops NUMBER -- LRU operations (moving chunks around in LRU list)
|
||||
, kghlurcr NUMBER -- recurrent chunks (pinned/unpinned 3 times or more)
|
||||
, kghlutrn NUMBER -- transient chunks (pinned 1-2 times)
|
||||
, kghlumxa NUMBER --
|
||||
, kghlumes NUMBER --
|
||||
, kghlumer NUMBER --
|
||||
, kghlurcn NUMBER -- reserved freelist scans
|
||||
, kghlurmi NUMBER -- reserved freelist misses
|
||||
, kghlurmz NUMBER -- last reserved scan miss size
|
||||
, kghlurmx NUMBER -- reserved list scan max miss size
|
||||
, kghlunfu NUMBER -- number of free-unpinned unsuccessful attempts
|
||||
, kghlunfs NUMBER -- last free unpinned unsuccessful size
|
||||
)
|
||||
TABLESPACE &tablespace STORAGE (INITIAL 1M NEXT 10M PCTINCREASE 0);
|
||||
|
||||
CREATE OR REPLACE VIEW spmon_heap_activity_view AS
|
||||
SELECT
|
||||
sample_time
|
||||
, kghluidx subpool
|
||||
, kghludur duration
|
||||
, CASE WHEN kghlufsh - NVL(lag(kghlufsh,1) over (partition by kghluidx, kghludur order by sample_time), kghlufsh) < 0
|
||||
THEN kghlufsh
|
||||
ELSE kghlufsh - lag(kghlufsh,1) over (partition by kghluidx, kghludur order by sample_time)
|
||||
END flushed_chunks_d
|
||||
, CASE WHEN kghluops - NVL(lag(kghluops,1) over (partition by kghluidx, kghludur order by sample_time), kghluops) < 0
|
||||
THEN kghluops
|
||||
ELSE kghluops - lag(kghluops,1) over (partition by kghluidx, kghludur order by sample_time)
|
||||
END lru_operations_d
|
||||
, CASE WHEN kghlurcn - NVL(lag(kghlurcn,1) over (partition by kghluidx, kghludur order by sample_time), kghlurcn) < 0
|
||||
THEN kghlurcn
|
||||
ELSE kghlurcn - lag(kghlurcn,1) over (partition by kghluidx, kghludur order by sample_time)
|
||||
END reserved_scans
|
||||
, CASE WHEN kghlurmi - NVL(lag(kghlurmi,1) over (partition by kghluidx, kghludur order by sample_time), kghlurmi) < 0
|
||||
THEN kghlurmi
|
||||
ELSE kghlurmi - lag(kghlurmi,1) over (partition by kghluidx, kghludur order by sample_time)
|
||||
END reserved_misses
|
||||
, CASE WHEN kghlunfu - NVL(lag(kghlunfu,1) over (partition by kghluidx, kghludur order by sample_time), kghlunfu) < 0
|
||||
THEN kghlunfu
|
||||
ELSE kghlunfu - lag(kghlunfu,1) over (partition by kghluidx, kghludur order by sample_time)
|
||||
END unsuccessful_flushes
|
||||
, kghlurmz last_unsucc_miss_req_size
|
||||
, kghlunfs last_unsucc_flush_req_size
|
||||
FROM
|
||||
spmon_heap_activity_stats
|
||||
/
|
||||
|
||||
-- chunk details (all chunks in reserved area are dumped here)
|
||||
-- x$ksmspr (v$shared_pool_reserved)
|
||||
CREATE TABLE spmon_reserved_chunk_details (
|
||||
sample_time DATE
|
||||
, addr RAW(8)
|
||||
, indx NUMBER
|
||||
, inst_id NUMBER
|
||||
, ksmchcom VARCHAR2(100)
|
||||
, ksmchptr RAW(8)
|
||||
, ksmchsiz NUMBER
|
||||
, ksmchcls VARCHAR2(100)
|
||||
, ksmchtyp NUMBER
|
||||
, ksmchpar RAW(8)
|
||||
)
|
||||
TABLESPACE &tablespace STORAGE (INITIAL 1M NEXT 10M PCTINCREASE 0);
|
||||
|
||||
-- min,max,avg chunk size grouped by chunk type and (allocation reason) comment
|
||||
-- x$ksmspr (v$shared_pool_reserved) summary
|
||||
CREATE TABLE spmon_reserved_chunk_stats (
|
||||
sample_time DATE
|
||||
, ksmchcls VARCHAR2(100)
|
||||
, ksmchcom VARCHAR2(100)
|
||||
, ksmchtype NUMBER
|
||||
, chunk_count NUMBER
|
||||
, total_size NUMBER
|
||||
, avg_size NUMBER
|
||||
, min_size NUMBER
|
||||
, max_size NUMBER
|
||||
)
|
||||
TABLESPACE &tablespace STORAGE (INITIAL 1M NEXT 10M PCTINCREASE 0);
|
||||
|
||||
GRANT SELECT ON SPMON_FLUSH_STATS TO PERFSTAT;
|
||||
GRANT SELECT ON SPMON_HEAP_ACTIVITY_STATS TO PERFSTAT;
|
||||
GRANT SELECT ON SPMON_RESERVED_CHUNK_DETAILS TO PERFSTAT;
|
||||
GRANT SELECT ON SPMON_RESERVED_CHUNK_STATS TO PERFSTAT;
|
||||
GRANT SELECT ON SPMON_SUBPOOL_STATS TO PERFSTAT;
|
||||
|
||||
GRANT SELECT ON spmon_heap_activity_view TO PERFSTAT;
|
||||
|
||||
|
||||
13
tpt/tools/collectors/space_collect.sql
Normal file
13
tpt/tools/collectors/space_collect.sql
Normal file
@@ -0,0 +1,13 @@
|
||||
-- Copyright 2018 Tanel Poder. All rights reserved. More info at http://tanelpoder.com
|
||||
-- Licensed under the Apache License, Version 2.0. See LICENSE.txt for terms & conditions.
|
||||
|
||||
-- this script requires PLANCAP_COLLECTOR package
|
||||
-- which is created using these scripts
|
||||
-- 1) plancap_collector_schema.sql
|
||||
-- 2) plancap_collector.sql
|
||||
|
||||
EXEC SNAP_DATA_FILES
|
||||
EXEC SNAP_FREE_SPACE
|
||||
EXEC SNAP_SEGMENT_SPACE
|
||||
EXEC SNAP_SERVICE_STATS
|
||||
|
||||
Reference in New Issue
Block a user