Files
oracle/csierra/pdb.sql
2026-03-12 21:23:47 +01:00

243 lines
8.0 KiB
SQL

-- pdb.sql - List all PDBs, then connect into one PDB
@@set.sql
COL cs_con_name NEW_V cs_con_name NOPRI;
SELECT SYS_CONTEXT('USERENV', 'CON_NAME') AS cs_con_name FROM DUAL
/
-- @@cs_internal/&&cs_set_container_to_cdb_root.
ALTER SESSION SET container = CDB$ROOT;
--
COL pdb_name FOR A30 HEA 'PDB Name' PRI;
COL con_id FOR 990 HEA 'CON|ID' PRI;
COL cpus FOR 9,990.000 HEA 'CPUs' PRI;
COL cpus_perc FOR 990.0 HEA 'CPUs|Perc%' PRI;
COL cpus_rank FOR 990 HEA 'CPUs|Rank' PRI;
COL space_gb FOR 99,990.000 HEA 'Space|GBs' PRI;
COL space_perc FOR 990.0 HEA 'Space|Perc%' PRI;
COL space_rank FOR 990 HEA 'Space|Rank' PRI;
COL iops FOR 9,999,990.000 HEA 'IOPS' PRI;
COL iops_perc FOR 990.0 HEA 'IOPS|Perc%' PRI;
COL iops_rank FOR 990 HEA 'IOPS|Rank' PRI;
COL mbps FOR 999,990.000 HEA 'MBPS' PRI;
COL mbps_perc FOR 990.0 HEA 'MBPS|Perc%' PRI;
COL mbps_rank FOR 990 HEA 'MBPS|Rank' PRI;
--
BREAK ON REPORT;
COMPUTE SUM OF cpus cpus_perc space_gb space_perc iops iops_perc mbps mbps_perc ON REPORT;
--
PRO
PRO Top PDBs
PRO ~~~~~~~~
WITH
rsrcmgrmetric AS (
SELECT r.con_id,
c.name AS pdb_name,
(SUM(r.cpu_consumed_time) / 1000) / (MAX(r.intsize_csec) / 100) AS cpus,
MAX(c.total_size) / POWER(2,30) AS space_gb,
SUM(r.io_requests) / (MAX(r.intsize_csec) / 100) AS iops,
SUM(r.io_megabytes) / (MAX(r.intsize_csec) / 100) AS mbps
FROM v$rsrcmgrmetric r,
v$containers c
WHERE r.con_id > 2 -- exclude CDB$ROOT
AND r.intsize_csec > 0
AND c.con_id = r.con_id
GROUP BY
r.con_id, -- needed since there are multiple consumer groups (usually 3) per time slice
c.name
),
rsrcmgrmetric_ext AS (
SELECT con_id,
pdb_name,
cpus,
100 * cpus / NULLIF(SUM(cpus) OVER(), 0) AS cpus_perc,
RANK() OVER(ORDER BY cpus DESC) AS cpus_rank,
space_gb,
100 * space_gb / NULLIF(SUM(space_gb) OVER(), 0) AS space_perc,
RANK() OVER(ORDER BY space_gb DESC) AS space_rank,
iops,
100 * iops / NULLIF(SUM(iops) OVER(), 0) AS iops_perc,
RANK() OVER(ORDER BY iops DESC) AS iops_rank,
mbps,
100 * mbps / NULLIF(SUM(mbps) OVER(), 0) AS mbps_perc,
RANK() OVER(ORDER BY mbps DESC) AS mbps_rank
FROM rsrcmgrmetric
)
SELECT r.cpus,
r.cpus_perc,
r.cpus_rank,
r.space_gb,
r.space_perc,
r.space_rank,
r.iops,
r.iops_perc,
r.iops_rank,
r.mbps,
r.mbps_perc,
r.mbps_rank,
r.pdb_name,
r.con_id
FROM rsrcmgrmetric_ext r
WHERE (r.cpus_perc > 1 OR r.space_perc > 1 OR r.iops_perc > 1 OR r.mbps_perc > 1)
AND (r.cpus > 0.1 OR r.space_gb > 0.1 OR r.iops > 0.001 OR r.mbps > 0.001)
-- AND r.cpus > 0.1
-- AND r.space_gb > 0.1
-- AND r.iops > 0.001
-- AND r.mbps > 0.001
ORDER BY
r.cpus_perc DESC,
r.space_perc DESC,
r.iops_perc DESC,
r.mbps_perc DESC
/
--
CLEAR BREAK COMPUTE;
--
COL pdb_name FOR A30 HEA '.|.|PDB Name' PRI;
COL con_id FOR 990 HEA 'CON|ID' PRI;
COL running_sessions_limit FOR 9,990.000 HEA 'Running|Sessions|Limit' PRI;
COL avg_running_sessions FOR 9,990.000 HEA 'Average|Running|Sessions' PRI;
COL avg_waiting_sessions FOR 9,990.000 HEA 'Average|Waiting|Sessions' PRI;
COL available_headroom_sessions FOR 9,990.000 HEA 'Available|Headroom|Sessions' PRI;
-- COL sessions FOR A9 HEA 'Sessions|Parameter' PRI;
COL sessions FOR 99,990 HEA 'Sessions|Parameter' PRI;
COL total_size_gb FOR 999,990.000 HEA 'Disk Space|Size (GBs)' PRI;
COL kiev FOR 9990 HEA 'Kiev|PDB' PRI;
COL wf FOR 990 HEA 'WF|PDB' PRI;
COL cpus FOR 9,990.000 HEA 'CPUs' PRI;
COL iops FOR 999,990.000 HEA 'IOPS' PRI;
COL mbps FOR 999,990.000 HEA 'MBPS' PRI;
COL creation_time FOR A19 HEA 'Creation Time' PRI;
COL open_time FOR A19 HEA 'Open Time' PRI;
COL open_mode FOR A10 HEA 'Open Mode' PRI;
--
BREAK ON REPORT;
COMPUTE COUNT OF kiev wf con_id ON REPORT;
COMPUTE SUM OF running_sessions_limit avg_running_sessions avg_waiting_sessions sessions available_headroom_sessions sessions cpus iops mbps total_size_gb ON REPORT;
--
PRO
PRO ALL PDBs
PRO ~~~~~~~~
WITH
c AS (
SELECT /*+ MATERIALIZE NO_MERGE */
con_id, con_uid, name AS pdb_name, CASE restricted WHEN 'YES' THEN 'RESTRICTED' ELSE open_mode END AS open_mode, CAST(open_time AS DATE) AS open_time, total_size / POWER(10, 9) AS total_size_gb, creation_time -- creation_time does not exist on 12.1
FROM v$containers
WHERE 1 = 1
AND con_id > 2
AND ROWNUM >= 1 /* MATERIALIZE */
),
r AS (
SELECT /*+ MATERIALIZE NO_MERGE */
con_id, MAX(running_sessions_limit) AS running_sessions_limit, SUM(avg_running_sessions) AS avg_running_sessions, SUM(avg_waiting_sessions) AS avg_waiting_sessions,
GREATEST(MAX(running_sessions_limit) - SUM(avg_running_sessions), 0) AS available_headroom_sessions,
(SUM(cpu_consumed_time) / 1000) / (MAX(intsize_csec) / 100) AS cpus,
SUM(io_requests) / (MAX(intsize_csec) / 100) AS iops,
SUM(io_megabytes) / (MAX(intsize_csec) / 100) AS mbps,
ROW_NUMBER() OVER (PARTITION BY con_id ORDER BY SUM(avg_running_sessions) DESC NULLS LAST) AS rn
FROM v$rsrcmgrmetric
WHERE intsize_csec > 0
AND ROWNUM >= 1 /* MATERIALIZE */
GROUP BY
con_id
),
-- k AS (
-- SELECT /*+ OPT_PARAM('_px_cdb_view_enabled' 'FALSE') MATERIALIZE NO_MERGE */
-- con_id
-- FROM cdb_tables
-- WHERE table_name = 'KIEVDATASTOREMETADATA'
-- AND ROWNUM >= 1 /* MATERIALIZE */
-- GROUP BY
-- con_id
-- ),
-- for better performance:
k AS (
SELECT DISTINCT con_id
FROM CONTAINERS(obj$)
WHERE name = 'KIEVDATASTOREMETADATA'
AND namespace = 1
AND type# = 2
AND status = 1
),
-- w AS (
-- SELECT /*+ OPT_PARAM('_px_cdb_view_enabled' 'FALSE') MATERIALIZE NO_MERGE */
-- con_id
-- FROM cdb_tables
-- WHERE table_name = 'WORKFLOWINSTANCES'
-- AND ROWNUM >= 1 /* MATERIALIZE */
-- GROUP BY
-- con_id
-- ),
-- for better performance:
w AS (
SELECT DISTINCT con_id
FROM CONTAINERS(obj$)
WHERE name = 'WORKFLOWINSTANCES'
AND namespace = 1
AND type# = 2
AND status = 1
),
s AS (
SELECT /*+ MATERIALIZE NO_MERGE */
con_id, MAX(TO_NUMBER(value)) AS value
FROM v$system_parameter
WHERE name = 'sessions'
AND ROWNUM >= 1 /* MATERIALIZE */
GROUP BY
con_id
),
p AS (
SELECT /*+ MATERIALIZE NO_MERGE */
--pdb_uid, MAX(TO_NUMBER(value$)) AS value
pdb_uid, SUBSTR(MAX(value$), 1, INSTR(MAX(value$)||',', ',') - 1) AS value
FROM sys.pdb_spfile$
WHERE pdb_uid > 1
AND BITAND(NVL(spare2, 0), 1) = 0 -- or: and spare2=0 (as per wilko.edens@gmail.com)
AND LOWER(name) = 'sessions'
AND ROWNUM >= 1 /* MATERIALIZE */
GROUP BY
pdb_uid
)
SELECT /*+ ORDERED */
c.pdb_name, c.con_id,
r.running_sessions_limit,
r.avg_running_sessions, r.available_headroom_sessions, r.avg_waiting_sessions,
-- COALESCE(s.value, p.value) AS sessions,
-- LPAD(COALESCE(TO_CHAR(s.value), p.value), 9, ' ') AS sessions,
COALESCE(s.value, TO_NUMBER(REGEXP_REPLACE(p.value, '[^0-9]', ''))) AS sessions,
r.cpus, c.total_size_gb, r.iops, r.mbps,
CASE WHEN k.con_id IS NOT NULL THEN 1 END AS kiev,
CASE WHEN w.con_id IS NOT NULL THEN 1 END AS wf,
-- '|' AS "|",
-- c.creation_time, c.open_time,
c.open_mode
FROM c, r, k, w, s, p
WHERE r.con_id(+) = c.con_id
--AND r.rn(+) = 1 -- expecting only one row anyways!
AND k.con_id(+) = c.con_id
AND w.con_id(+) = c.con_id
AND s.con_id(+) = c.con_id
AND p.pdb_uid(+) = c.con_uid
ORDER BY
c.pdb_name
/
PRO
PRO Running Sessions Limit: Resource Manager Utilization Limit (CPU cap after which throttling stars.)
PRO Average Running Sessions: AAS on CPU.
PRO Available Headroom Sessions: Potential AAS slots available for sessions on CPU.
PRO Average Waiting Sessions: AAS wating on Scheduler (Resource Manager throttling.)
--
PRO
PRO 1. Enter PDB Name: [{&&cs_con_name.}|PDB Name]
DEF pdb_name = '&1.';
UNDEF 1 2 3 4 5 6 7 8 9 10 11 12;
SELECT COALESCE(TRIM('&&pdb_name.'), '&&cs_con_name.') AS cs_con_name FROM DUAL
/
--
-- @@cs_internal/&&cs_set_container_to_curr_pdb.
ALTER SESSION SET CONTAINER = &&cs_con_name.;
--
PRO
PRO Connected to: &cs_con_name.
PRO
--
CLEAR BREAK COLUMNS COMPUTE;