forked from carlos-sierra/cscripts
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcs_plans_summary_all.sql
More file actions
98 lines (98 loc) · 5.69 KB
/
Copy pathcs_plans_summary_all.sql
File metadata and controls
98 lines (98 loc) · 5.69 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
-- cs_plans_summary_all.sql: called by planx.sql and cs_sqlperf.sql (deprecated)
COL con_id FOR 999 HEA 'Con|ID';
COL pdb_name FOR A30 HEA 'PDB Name' FOR A30 TRUNC;
COL last_active_time FOR A19 HEA 'Last Active Time';
COL plan_hash_value FOR 9999999999 HEA 'Plan Hash|Value';
COL plan_hash_value_2 FOR 9999999999 HEA 'Plan Hash|Value 2';
COL full_plan_hash_value FOR 9999999999 HEA 'Full Plan|Hash Value';
COL cursors FOR 9,999,990 HEA 'Child|Cursors';
COL valid FOR 9,999,990 HEA 'Valid|Cursors';
COL invalid FOR 9,999,990 HEA 'Invalid|Cursors';
COL obsolete FOR 9,999,990 HEA 'Obsolete|Cursors';
COL shareable FOR 9,999,990 HEA 'Shareable|Cursors';
COL bind_sens FOR 9,999,990 HEA 'Bind|Sensitive|Cursors';
COL bind_aware FOR 9,999,990 HEA 'Bind|Aware|Cursors';
COL executions FOR 999,999,999,999,990 HEA 'Total|Executions';
COL avg_et_ms_pe FOR 99,999,990.000 HEA 'Avg Elapsed|Time (ms)|Per Execution';
COL avg_cpu_ms_pe FOR 99,999,990.000 HEA 'Avg CPU|Time (ms)|Per Execution';
COL avg_bg_pe FOR 999,999,999,990 HEA 'Avg|Buffer Gets|Per Execution';
COL avg_disk_pe FOR 999,999,999,990 HEA 'Avg|Disk Reads|Per Execution';
COL avg_row FOR 999,999,990.000 HEA 'Avg Rows|Processed|Per Execution';
COL avg_et_ms_pr FOR 99,999,990.000 HEA 'Avg Elapsed|Time (ms)|Per Row Proc';
COL avg_cpu_ms_pr FOR 99,999,990.000 HEA 'Avg CPU|Time (ms)|Per Row Proc';
COL avg_bg_pr FOR 999,999,999,990.0 HEA 'Avg|Buffer Gets|Per Row Proc';
COL avg_disk_pr FOR 999,999,999,990.0 HEA 'Avg|Disk Reads|Per Row Proc';
COL bg_per_capped_rows FOR 999,999,999,990 HEA 'Avg|Buffer Gets|Per Capped Rows';
COL ms_per_capped_rows FOR 99,999,990.000 HEA 'Avg CPU|Time (ms)|Per Capped Rows';
--
@@&&cs_set_container_to_cdb_root.
--
PRO
PRO PLANS SUMMARY (v$sql all PDBs)
PRO ~~~~~~~~~~~~~
SELECT s.con_id,
c.name AS pdb_name,
TO_CHAR(MAX(s.last_active_time), '&&cs_datetime_full_format.') AS last_active_time,
s.sql_id,
s.plan_hash_value,
-- p.plan_hash_value_2,
s.full_plan_hash_value,
COUNT(*) AS cursors,
'|' AS "|",
SUM(CASE SUBSTR(s.object_status, 1, 5) WHEN 'VALID' THEN 1 ELSE 0 END) AS valid,
SUM(CASE SUBSTR(s.object_status, 1, 7) WHEN 'INVALID' THEN 1 ELSE 0 END) AS invalid,
SUM(CASE s.is_obsolete WHEN 'Y' THEN 1 ELSE 0 END) AS obsolete,
SUM(CASE s.is_shareable WHEN 'Y' THEN 1 ELSE 0 END) AS shareable,
SUM(CASE s.is_bind_sensitive WHEN 'Y' THEN 1 ELSE 0 END) AS bind_sens,
SUM(CASE s.is_bind_aware WHEN 'Y' THEN 1 ELSE 0 END) AS bind_aware,
'|' AS "|",
SUM(s.executions) AS executions,
SUM(s.elapsed_time)/NULLIF(SUM(s.executions), 0)/1e3 AS avg_et_ms_pe,
SUM(s.cpu_time)/NULLIF(SUM(s.executions), 0)/1e3 AS avg_cpu_ms_pe,
SUM(s.buffer_gets)/NULLIF(SUM(s.executions), 0) AS avg_bg_pe,
SUM(s.disk_reads)/NULLIF(SUM(s.executions), 0) AS avg_disk_pe,
SUM(s.rows_processed)/NULLIF(SUM(s.executions), 0) AS avg_row,
'|' AS "|",
SUM(s.elapsed_time)/NULLIF(SUM(s.rows_processed), 0)/1e3 AS avg_et_ms_pr,
SUM(s.cpu_time)/NULLIF(SUM(s.rows_processed), 0)/1e3 AS avg_cpu_ms_pr,
CASE WHEN SUM(s.cpu_time)/NULLIF(SUM(s.rows_processed), 0)/1e3 > &&cs_cpu_ms_per_row. THEN '*' END AS h,
SUM(s.buffer_gets)/NULLIF(SUM(s.rows_processed), 0) AS avg_bg_pr,
CASE WHEN SUM(s.buffer_gets)/NULLIF(SUM(s.rows_processed), 0) > &&cs_buffer_gets_per_row. THEN '*' END AS h,
SUM(s.disk_reads)/NULLIF(SUM(s.rows_processed), 0) AS avg_disk_pr,
CASE WHEN SUM(s.disk_reads)/NULLIF(SUM(s.rows_processed), 0) > &&cs_disk_reads_per_row. THEN '*' END AS h,
'|' AS "|",
(SUM(s.buffer_gets)/NULLIF(SUM(s.executions), 0)) / GREATEST(SUM(s.rows_processed)/NULLIF(SUM(s.executions), 0), &&cs_min_rows_per_exec_cap.) AS bg_per_capped_rows,
(SUM(s.cpu_time)/NULLIF(SUM(s.executions), 0)/1e3) / GREATEST(SUM(s.rows_processed)/NULLIF(SUM(s.executions), 0), &&cs_min_rows_per_exec_cap.) AS ms_per_capped_rows
FROM v$sql s,
v$containers c
-- had to remove this part due to performance issues on sql with hcv (e.g.: DBPERF-7505)
-- OUTER APPLY ( -- could be CROSS APPLY since we expect one and only one row
-- SELECT TO_NUMBER(EXTRACTVALUE(XMLTYPE(p.other_xml),'/*/info[@type = "plan_hash_2"]')) AS plan_hash_value_2
-- FROM v$sql_plan p
-- WHERE p.con_id = s.con_id
-- AND p.address = s.address
-- AND p.hash_value = s.hash_value
-- AND p.sql_id = s.sql_id
-- AND p.plan_hash_value = s.plan_hash_value
-- AND p.child_address = s.child_address
-- AND p.child_number = s.child_number
-- AND p.other_xml IS NOT NULL
-- --AND p.id = 1
-- AND TO_NUMBER(EXTRACTVALUE(XMLTYPE(p.other_xml),'/*/info[@type = "plan_hash_2"]')) >= 0
-- AND ROWNUM >= 1 /* MATERIALIZE NO_MERGE */
-- ORDER BY
-- p.timestamp DESC, p.id
-- FETCH FIRST 1 ROW ONLY -- redundant. expecting one and only one row
-- ) p
WHERE s.sql_text LIKE SUBSTR(:cs_sql_text_1000, 1, 40)||'%'
AND LPAD(MOD(DBMS_SQLTUNE.sqltext_to_signature(REPLACE(CASE WHEN s.sql_fulltext LIKE '/* %(%,%)% [____] */%' THEN REGEXP_REPLACE(s.sql_fulltext, '\[([[:digit:]]{4})\] ') ELSE s.sql_fulltext END,s.parsing_schema_name)),100000),5,'0') = &&cs_sqlid.
AND c.con_id = s.con_id
GROUP BY
s.con_id, c.name, s.sql_id, s.plan_hash_value, /*p.plan_hash_value_2,*/ s.full_plan_hash_value
ORDER BY
1, 2, 3, 4, 5
/
PRO Note (H) = "*" means High. Expecting less than &&cs_cpu_ms_per_row. CPU ms per row processed, less than &&cs_buffer_gets_per_row. Buffer Gets per row processed, and less than &&cs_disk_reads_per_row. Disk Reads per row processed.
--
@@&&cs_set_container_to_curr_pdb.
--