forked from carlos-sierra/cscripts
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcs_high_execution_rate_rps.sql
More file actions
executable file
·158 lines (158 loc) · 6.55 KB
/
cs_high_execution_rate_rps.sql
File metadata and controls
executable file
·158 lines (158 loc) · 6.55 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
----------------------------------------------------------------------------------------
--
-- File name: cs_high_execution_rate_rps.sql
--
-- Purpose: List executions by time for a given SQL_ID with high RPS
--
-- Author: Carlos Sierra
--
-- Version: 2023/04/27
--
-- Usage: Execute connected to PDB.
--
-- Enter SQL_ID when requested.
--
-- Example: $ sqlplus / as sysdba
-- SQL> @cs_high_execution_rate_rps.sql
--
-- Notes: Developed and tested on 19c
--
---------------------------------------------------------------------------------------
--
@@cs_internal/cs_primary.sql
@@cs_internal/cs_cdb_warn.sql
@@cs_internal/cs_set.sql
@@cs_internal/cs_def.sql
@@cs_internal/cs_file_prefix.sql
--
DEF cs_script_name = 'cs_high_execution_rate_rps';
--
PRO 1. SQL_ID:
DEF cs_sql_id = '&1.';
UNDEF 1;
--
PRO
PRO 2. Seconds: [{1}|1-60]
DEF cs_seconds = '&2.';
UNDEF 2;
COL cs_seconds NEW_V cs_seconds NOPRI;
SELECT CASE WHEN TO_NUMBER('&&cs_seconds.') BETWEEN 1 AND 60 THEN '&&cs_seconds.' ELSE '1' END AS cs_seconds FROM DUAL
/
--
@@cs_internal/cs_last_snap.sql
--
SELECT '&&cs_file_prefix._&&cs_script_name._&&cs_sql_id.' cs_file_name FROM DUAL;
--
@@cs_internal/cs_signature.sql
@@cs_internal/cs_spool_head.sql
PRO SQL> @&&cs_script_name..sql "&&cs_sql_id." "&&cs_seconds."
@@cs_internal/cs_spool_id.sql
@@cs_internal/cs_spool_id_list_sql_id.sql
--
PRO SECONDS : &&cs_seconds.
--
@@cs_internal/cs_print_sql_text.sql
PRO
PRO Samples (v$sqlstats)
PRO ~~~~~~~
SET SERVEROUT ON;
DECLARE
l_begin_timestamp TIMESTAMP(6) := SYSTIMESTAMP;
l_exit_timestamp TIMESTAMP(6) := l_begin_timestamp + INTERVAL '&&cs_seconds.' SECOND;
l_timestamp TIMESTAMP(6);
l_parse_calls NUMBER;
l_executions NUMBER;
l_rows_processed NUMBER;
l_us_delta NUMBER;
l_parse_calls_total NUMBER := 0;
l_executons_total NUMBER := 0;
l_rows_processed_total NUMBER := 0;
l_us_total NUMBER := 0;
l_parse_calls_delta NUMBER;
l_executions_delta NUMBER;
l_rows_processed_delta NUMBER;
l_timestamp_prior TIMESTAMP(6) := l_begin_timestamp;
l_parse_calls_prior NUMBER;
l_executions_prior NUMBER;
l_rows_processed_prior NUMBER;
l_timestamp_zero_begin TIMESTAMP(6) := l_begin_timestamp;
l_timestamp_zero_end TIMESTAMP(6);
l_us_delta_zero NUMBER;
l_samples_zero NUMBER := 0;
l_samples_total NUMBER := 0;
BEGIN
WHILE SYSTIMESTAMP < l_exit_timestamp
LOOP
SELECT parse_calls, executions, rows_processed INTO l_parse_calls, l_executions, l_rows_processed FROM v$sqlstats WHERE sql_id = '&&cs_sql_id.';
l_timestamp := SYSTIMESTAMP;
l_us_delta := ((86400 * EXTRACT(DAY FROM (l_timestamp - l_timestamp_prior)) + (3600 * EXTRACT(HOUR FROM (l_timestamp - l_timestamp_prior))) + (60 * EXTRACT(MINUTE FROM (l_timestamp - l_timestamp_prior))) + EXTRACT(SECOND FROM (l_timestamp - l_timestamp_prior)))) * 1e6;
l_parse_calls_delta := l_parse_calls - l_parse_calls_prior;
l_executions_delta := l_executions - l_executions_prior;
l_rows_processed_delta := l_rows_processed - l_rows_processed_prior;
l_samples_total := l_samples_total + 1;
IF l_us_delta > 0 THEN
l_us_total := l_us_total + l_us_delta;
l_parse_calls_total := NVL(l_parse_calls_total, 0) + l_parse_calls_delta;
l_executons_total := NVL(l_executons_total, 0) + l_executions_delta;
l_rows_processed_total := NVL(l_rows_processed_total, 0) + l_rows_processed_delta;
END IF;
--
IF l_parse_calls_delta > 0 OR l_executions_delta > 0 OR l_rows_processed_delta > 0 THEN
IF l_timestamp_zero_begin IS NOT NULL AND l_timestamp_zero_end IS NOT NULL THEN
l_us_delta_zero := ((86400 * EXTRACT(DAY FROM (l_timestamp_zero_end - l_timestamp_zero_begin)) + (3600 * EXTRACT(HOUR FROM (l_timestamp_zero_end - l_timestamp_zero_begin))) + (60 * EXTRACT(MINUTE FROM (l_timestamp_zero_end - l_timestamp_zero_begin))) + EXTRACT(SECOND FROM (l_timestamp_zero_end - l_timestamp_zero_begin)))) * 1e6;
DBMS_OUTPUT.put_line (
RPAD(TO_CHAR(l_timestamp_zero_begin, 'YYYY-MM-DD"T"HH24:MI:SS.FF6'), 26, ' ')||' - '||
RPAD(TO_CHAR(l_timestamp_zero_end, 'YYYY-MM-DD"T"HH24:MI:SS.FF6'), 26, ' ')||
LPAD(TO_CHAR(l_us_delta_zero, '999,999,990'), 12, ' ')||' us'||
LPAD(TO_CHAR(0, '999,990'), 8, ' ')||' parses'||
LPAD(TO_CHAR(0, '999,990'), 8, ' ')||' executions'||
LPAD(TO_CHAR(0, '999,999,990'), 12, ' ')||' rows'||
LPAD(TO_CHAR(l_samples_zero, '9,999,990'), 10, ' ')||' samples'
);
END IF;
--
IF l_timestamp_prior IS NOT NULL AND l_timestamp IS NOT NULL THEN
DBMS_OUTPUT.put_line (
RPAD(TO_CHAR(l_timestamp_prior, 'YYYY-MM-DD"T"HH24:MI:SS.FF6'), 26, ' ')||' - '||
RPAD(TO_CHAR(l_timestamp, 'YYYY-MM-DD"T"HH24:MI:SS.FF6'), 26, ' ')||
LPAD(TO_CHAR(l_us_delta, '999,999,990'), 12, ' ')||' us'||
LPAD(TO_CHAR(l_parse_calls_delta, '999,990'), 8, ' ')||' parses'||
LPAD(TO_CHAR(l_executions_delta, '999,990'), 8, ' ')||' executions'||
LPAD(TO_CHAR(l_rows_processed_delta, '999,999,990'), 12, ' ')||' rows'
);
END IF;
l_timestamp_zero_begin := l_timestamp;
l_timestamp_zero_end := NULL;
l_samples_zero := 0;
ELSE
l_timestamp_zero_end := l_timestamp;
l_samples_zero := NVL(l_samples_zero, 0) + 1;
END IF;
--
l_timestamp_prior := l_timestamp;
l_parse_calls_prior := l_parse_calls;
l_executions_prior := l_executions;
l_rows_processed_prior := l_rows_processed;
END LOOP;
--
DBMS_OUTPUT.put_line('---');
DBMS_OUTPUT.put_line (
RPAD(TO_CHAR(l_begin_timestamp, 'YYYY-MM-DD"T"HH24:MI:SS.FF6'), 26, ' ')||' - '||
RPAD(TO_CHAR(l_timestamp, 'YYYY-MM-DD"T"HH24:MI:SS.FF6'), 26, ' ')||
LPAD(TO_CHAR(l_us_total, '999,999,990'), 12, ' ')||' us'||
LPAD(TO_CHAR(l_parse_calls_total, '999,990'), 8, ' ')||' parses'||
LPAD(TO_CHAR(l_executons_total, '999,990'), 8, ' ')||' executions'||
LPAD(TO_CHAR(l_rows_processed_total, '999,999,990'), 12, ' ')||' rows'||
LPAD(TO_CHAR(l_samples_total, '9,999,990'), 10, ' ')||' samples'
);
END;
/
SET SERVEROUT OFF;
--
PRO
PRO SQL> @&&cs_script_name..sql "&&cs_sql_id." "&&cs_seconds."
--
@@cs_internal/cs_spool_tail.sql
@@cs_internal/cs_undef.sql
@@cs_internal/cs_reset.sql
--