* PostgreSQL Performance Views
*
* Copyright (c) 1996-2019, PostgreSQL Global Development Group
*
* src/backend/catalog/performance_views.sql
*/
CREATE VIEW dbe_perf.os_runtime AS
SELECT * FROM pv_os_run_info();
CREATE VIEW dbe_perf.node_name AS
SELECT * FROM pgxc_node_str() AS node_name;
CREATE OR REPLACE FUNCTION dbe_perf.get_global_os_runtime
(OUT node_name name, OUT id integer, OUT name text, OUT value numeric, OUT comments text, OUT cumulative boolean)
RETURNS setof record
AS $$
DECLARE
row_data dbe_perf.os_runtime%rowtype;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.os_runtime';
FOR row_data IN EXECUTE(query_str) LOOP
node_name := row_name.node_name;
id := row_data.id;
name := row_data.name;
value := row_data.value;
comments := row_data.comments;
cumulative := row_data.cumulative;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_os_runtime AS
SELECT DISTINCT * FROM dbe_perf.get_global_os_runtime();
CREATE VIEW dbe_perf.os_threads AS
SELECT
S.node_name,
S.pid,
S.lwpid,
S.thread_name,
S.creation_time
FROM pg_stat_get_thread() AS S;
CREATE OR REPLACE FUNCTION dbe_perf.get_global_os_threads()
RETURNS setof dbe_perf.os_threads
AS $$
DECLARE
row_data dbe_perf.os_threads%rowtype;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.os_threads';
FOR row_data IN EXECUTE(query_str) LOOP
return next row_data;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_os_threads AS
SELECT DISTINCT * FROM dbe_perf.get_global_os_threads();
CREATE VIEW dbe_perf.instance_time AS
SELECT * FROM pv_instance_time();
CREATE OR REPLACE FUNCTION dbe_perf.get_global_instance_time
(OUT node_name name, OUT stat_id integer, OUT stat_name text, OUT value bigint)
RETURNS setof record
AS $$
DECLARE
row_data dbe_perf.instance_time%rowtype;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.instance_time';
FOR row_data IN EXECUTE(query_str) LOOP
node_name := row_name.node_name;
stat_id := row_data.stat_id;
stat_name := row_data.stat_name;
value := row_data.value;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_instance_time AS
SELECT DISTINCT * FROM dbe_perf.get_global_instance_time();
CREATE VIEW dbe_perf.workload_sql_count AS
SELECT
pg_user.respool as workload,
pg_catalog.sum(S.select_count)::bigint AS select_count,
pg_catalog.sum(S.update_count)::bigint AS update_count,
pg_catalog.sum(S.insert_count)::bigint AS insert_count,
pg_catalog.sum(S.delete_count)::bigint AS delete_count,
pg_catalog.sum(S.ddl_count)::bigint AS ddl_count,
pg_catalog.sum(S.dml_count)::bigint AS dml_count,
pg_catalog.sum(S.dcl_count)::bigint AS dcl_count
FROM
pg_user left join pg_stat_get_sql_count() AS S on pg_user.usename = S.user_name
GROUP by pg_user.respool;
CREATE VIEW dbe_perf.workload_sql_elapse_time AS
SELECT
pg_user.respool as workload,
pg_catalog.sum(S.total_select_elapse)::bigint AS total_select_elapse,
pg_catalog.MAX(S.max_select_elapse) AS max_select_elapse,
pg_catalog.MIN(S.min_select_elapse) AS min_select_elapse,
((pg_catalog.sum(S.total_select_elapse) / greatest(pg_catalog.sum(S.select_count), 1))::bigint) AS avg_select_elapse,
pg_catalog.sum(S.total_update_elapse)::bigint AS total_update_elapse,
pg_catalog.MAX(S.max_update_elapse) AS max_update_elapse,
pg_catalog.MIN(S.min_update_elapse) AS min_update_elapse,
((pg_catalog.sum(S.total_update_elapse) / greatest(pg_catalog.sum(S.update_count), 1))::bigint) AS avg_update_elapse,
pg_catalog.sum(S.total_insert_elapse)::bigint AS total_insert_elapse,
pg_catalog.MAX(S.max_insert_elapse) AS max_insert_elapse,
pg_catalog.MIN(S.min_insert_elapse) AS min_insert_elapse,
((pg_catalog.sum(S.total_insert_elapse) / greatest(pg_catalog.sum(S.insert_count), 1))::bigint) AS avg_insert_elapse,
pg_catalog.sum(S.total_delete_elapse)::bigint AS total_delete_elapse,
pg_catalog.MAX(S.max_delete_elapse) AS max_delete_elapse,
pg_catalog.MIN(S.min_delete_elapse) AS min_delete_elapse,
((pg_catalog.sum(S.total_delete_elapse) / greatest(pg_catalog.sum(S.delete_count), 1))::bigint) AS avg_delete_elapse
FROM
pg_user left join pg_stat_get_sql_count() AS S on pg_user.usename = S.user_name
GROUP by pg_user.respool;
CREATE OR REPLACE FUNCTION dbe_perf.get_summary_workload_sql_count
(OUT node_name name, OUT workload name, OUT select_count bigint,
OUT update_count bigint, OUT insert_count bigint, OUT delete_count bigint,
OUT ddl_count bigint, OUT dml_count bigint, OUT dcl_count bigint)
RETURNS setof record
AS $$
DECLARE
row_data dbe_perf.workload_sql_count%rowtype;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.workload_sql_count';
FOR row_data IN EXECUTE(query_str) LOOP
node_name := row_name.node_name;
workload := row_data.workload;
select_count := row_data.select_count;
update_count := row_data.update_count;
insert_count := row_data.insert_count;
delete_count := row_data.delete_count;
ddl_count := row_data.ddl_count;
dml_count := row_data.dml_count;
dcl_count := row_data.dcl_count;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.summary_workload_sql_count AS
SELECT * FROM dbe_perf.get_summary_workload_sql_count();
CREATE OR REPLACE FUNCTION dbe_perf.get_summary_workload_sql_elapse_time
(OUT node_name name, OUT workload name,
OUT total_select_elapse bigint, OUT max_select_elapse bigint, OUT min_select_elapse bigint, OUT avg_select_elapse bigint,
OUT total_update_elapse bigint, OUT max_update_elapse bigint, OUT min_update_elapse bigint, OUT avg_update_elapse bigint,
OUT total_insert_elapse bigint, OUT max_insert_elapse bigint, OUT min_insert_elapse bigint, OUT avg_insert_elapse bigint,
OUT total_delete_elapse bigint, OUT max_delete_elapse bigint, OUT min_delete_elapse bigint, OUT avg_delete_elapse bigint)
RETURNS setof record
AS $$
DECLARE
row_data dbe_perf.workload_sql_elapse_time%rowtype;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.workload_sql_elapse_time';
FOR row_data IN EXECUTE(query_str) LOOP
node_name := row_name.node_name;
workload := row_data.workload;
total_select_elapse := row_data.total_select_elapse;
max_select_elapse := row_data.max_select_elapse;
min_select_elapse := row_data.min_select_elapse;
avg_select_elapse := row_data.avg_select_elapse;
total_update_elapse := row_data.total_update_elapse;
max_update_elapse := row_data.max_update_elapse;
min_update_elapse := row_data.min_update_elapse;
avg_update_elapse := row_data.avg_update_elapse;
total_insert_elapse := row_data.total_insert_elapse;
max_insert_elapse := row_data.max_insert_elapse;
min_insert_elapse := row_data.min_insert_elapse;
avg_insert_elapse := row_data.avg_insert_elapse;
total_delete_elapse := row_data.total_delete_elapse;
max_delete_elapse := row_data.max_delete_elapse;
min_delete_elapse := row_data.min_delete_elapse;
avg_delete_elapse := row_data.avg_delete_elapse;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.summary_workload_sql_elapse_time AS
SELECT * FROM dbe_perf.get_summary_workload_sql_elapse_time();
CREATE VIEW dbe_perf.user_transaction AS
SELECT
pg_user.usename as usename,
giwi.commit_counter as commit_counter,
giwi.rollback_counter as rollback_counter,
giwi.resp_min as resp_min,
giwi.resp_max as resp_max,
giwi.resp_avg as resp_avg,
giwi.resp_total as resp_total,
giwi.bg_commit_counter as bg_commit_counter,
giwi.bg_rollback_counter as bg_rollback_counter,
giwi.bg_resp_min as bg_resp_min,
giwi.bg_resp_max as bg_resp_max,
giwi.bg_resp_avg as bg_resp_avg,
giwi.bg_resp_total as bg_resp_total
FROM
pg_user left join pg_catalog.get_instr_workload_info(0) AS giwi on pg_user.usesysid = giwi.user_oid;
CREATE OR REPLACE FUNCTION dbe_perf.get_global_user_transaction
(OUT node_name name, OUT usename name, OUT commit_counter bigint,
OUT rollback_counter bigint, OUT resp_min bigint, OUT resp_max bigint,
OUT resp_avg bigint, OUT resp_total bigint, OUT bg_commit_counter bigint,
OUT bg_rollback_counter bigint, OUT bg_resp_min bigint, OUT bg_resp_max bigint,
OUT bg_resp_avg bigint, OUT bg_resp_total bigint)
RETURNS setof record
AS $$
DECLARE
row_data dbe_perf.user_transaction%rowtype;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.user_transaction';
FOR row_data IN EXECUTE(query_str) LOOP
node_name := row_name.node_name;
usename := row_data.usename;
commit_counter := row_data.commit_counter;
rollback_counter := row_data.rollback_counter;
resp_min := row_data.resp_min;
resp_max := row_data.resp_max;
resp_avg := row_data.resp_avg;
resp_total := row_data.resp_total;
bg_commit_counter := row_data.bg_commit_counter;
bg_rollback_counter := row_data.bg_rollback_counter;
bg_resp_min := row_data.bg_resp_min;
bg_resp_max := row_data.bg_resp_max;
bg_resp_avg := row_data.bg_resp_avg;
bg_resp_total := row_data.bg_resp_total;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_user_transaction AS
SELECT * FROM dbe_perf.get_global_user_transaction();
CREATE VIEW dbe_perf.workload_transaction AS
select
pg_user.respool as workload,
pg_catalog.sum(W.commit_counter)::bigint as commit_counter,
pg_catalog.sum(W.rollback_counter)::bigint as rollback_counter,
pg_catalog.min(W.resp_min)::bigint as resp_min,
pg_catalog.max(W.resp_max)::bigint as resp_max,
((pg_catalog.sum(W.resp_total) / greatest(pg_catalog.sum(W.commit_counter), 1))::bigint) AS resp_avg,
pg_catalog.sum(W.resp_total)::bigint as resp_total,
pg_catalog.sum(W.bg_commit_counter)::bigint as bg_commit_counter,
pg_catalog.sum(W.bg_rollback_counter)::bigint as bg_rollback_counter,
pg_catalog.min(W.bg_resp_min)::bigint as bg_resp_min,
pg_catalog.max(W.bg_resp_max)::bigint as bg_resp_max,
((pg_catalog.sum(W.bg_resp_total) / greatest(pg_catalog.sum(W.bg_commit_counter), 1))::bigint) AS bg_resp_avg,
pg_catalog.sum(W.bg_resp_total)::bigint as bg_resp_total
from
pg_user left join dbe_perf.user_transaction AS W on pg_user.usename = W.usename
group by
pg_user.respool;
CREATE OR REPLACE FUNCTION dbe_perf.get_global_workload_transaction
(OUT node_name name, OUT workload name, OUT commit_counter bigint,
OUT rollback_counter bigint, OUT resp_min bigint, OUT resp_max bigint,
OUT resp_avg bigint, OUT resp_total bigint, OUT bg_commit_counter bigint,
OUT bg_rollback_counter bigint, OUT bg_resp_min bigint, OUT bg_resp_max bigint,
OUT bg_resp_avg bigint, OUT bg_resp_total bigint)
RETURNS setof record
AS $$
DECLARE
row_data dbe_perf.workload_transaction%rowtype;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.workload_transaction';
FOR row_data IN EXECUTE(query_str) LOOP
node_name := row_name.node_name;
workload := row_data.workload;
commit_counter := row_data.commit_counter;
rollback_counter := row_data.rollback_counter;
resp_min := row_data.resp_min;
resp_max := row_data.resp_max;
resp_avg := row_data.resp_avg;
resp_total := row_data.resp_total;
bg_commit_counter := row_data.bg_commit_counter;
bg_rollback_counter := row_data.bg_rollback_counter;
bg_resp_min := row_data.bg_resp_min;
bg_resp_max := row_data.bg_resp_max;
bg_resp_avg := row_data.bg_resp_avg;
bg_resp_total := row_data.bg_resp_total;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_workload_transaction AS
SELECT * FROM dbe_perf.get_global_workload_transaction();
CREATE VIEW dbe_perf.summary_workload_transaction AS
SELECT
W.workload AS workload,
pg_catalog.sum(W.commit_counter) AS commit_counter,
pg_catalog.sum(W.rollback_counter) AS rollback_counter,
coalesce(pg_catalog.min(NULLIF(W.resp_min, 0)), 0) AS resp_min,
pg_catalog.max(W.resp_max) AS resp_max,
((pg_catalog.sum(W.resp_total) / greatest(pg_catalog.sum(W.commit_counter), 1))::bigint) AS resp_avg,
pg_catalog.sum(W.resp_total) AS resp_total,
pg_catalog.sum(W.bg_commit_counter) AS bg_commit_counter,
pg_catalog.sum(W.bg_rollback_counter) AS bg_rollback_counter,
coalesce(pg_catalog.min(NULLIF(W.bg_resp_min, 0)), 0) AS bg_resp_min,
pg_catalog.max(W.bg_resp_max) AS bg_resp_max,
((pg_catalog.sum(W.bg_resp_total) / greatest(pg_catalog.sum(W.bg_commit_counter), 1))::bigint) AS bg_resp_avg,
pg_catalog.sum(W.bg_resp_total) AS bg_resp_total
FROM dbe_perf.get_global_workload_transaction() AS W
GROUP by W.workload;
CREATE VIEW dbe_perf.session_stat AS
SELECT * FROM pv_session_stat();
CREATE OR REPLACE FUNCTION dbe_perf.get_global_session_stat
(OUT node_name name, OUT sessid text, OUT statid integer, OUT statname text, OUT statunit text, OUT value bigint)
RETURNS setof record
AS $$
DECLARE
row_data dbe_perf.session_stat%rowtype;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.session_stat';
FOR row_data IN EXECUTE(query_str) LOOP
node_name := row_name.node_name;
sessid := row_data.sessid;
statid := row_data.statid;
statname := row_data.statname;
statunit := row_data.statunit;
value := row_data.value;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_session_stat AS
SELECT DISTINCT * FROM dbe_perf.get_global_session_stat();
CREATE VIEW dbe_perf.session_time AS
SELECT * FROM pv_session_time();
CREATE OR REPLACE FUNCTION dbe_perf.get_global_session_time
(OUT node_name name, OUT sessid text, OUT stat_id integer, OUT stat_name text, OUT value bigint)
RETURNS setof record
AS $$
DECLARE
row_data dbe_perf.session_time%rowtype;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.session_time';
FOR row_data IN EXECUTE(query_str) LOOP
node_name := row_name.node_name;
sessid := row_data.sessid;
stat_id := row_data.stat_id;
stat_name := row_data.stat_name;
value := row_data.value;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_session_time AS
SELECT DISTINCT * FROM dbe_perf.get_global_session_time();
CREATE VIEW dbe_perf.session_memory AS
SELECT * FROM pv_session_memory();
CREATE OR REPLACE FUNCTION dbe_perf.get_global_session_memory
(OUT node_name name, OUT sessid text, OUT init_mem integer, OUT used_mem integer, OUT peak_mem integer)
RETURNS setof record
AS $$
DECLARE
row_data dbe_perf.session_memory%rowtype;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.session_memory';
FOR row_data IN EXECUTE(query_str) LOOP
node_name := row_name.node_name;
sessid := row_data.sessid;
init_mem := row_data.init_mem;
used_mem := row_data.used_mem;
peak_mem := row_data.peak_mem;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_session_memory AS
SELECT DISTINCT * FROM dbe_perf.get_global_session_memory();
CREATE VIEW dbe_perf.session_memory_detail AS
SELECT * FROM gs_session_memory_detail_tp();
CREATE OR REPLACE FUNCTION dbe_perf.get_global_session_memory_detail
(OUT node_name name, OUT sessid text, OUT sesstype text, OUT contextname text, OUT level smallint,
OUT parent text, OUT totalsize bigint, OUT freesize bigint, OUT usedsize bigint)
RETURNS setof record
AS $$
DECLARE
row_data dbe_perf.session_memory_detail%rowtype;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.session_memory_detail';
FOR row_data IN EXECUTE(query_str) LOOP
node_name := row_name.node_name;
sessid := row_data.sessid;
sesstype := row_data.sesstype;
contextname := row_data.contextname;
level := row_data.level;
parent := row_data.parent;
totalsize := row_data.totalsize;
freesize := row_data.freesize;
usedsize := row_data.usedsize;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_session_memory_detail AS
SELECT DISTINCT * FROM dbe_perf.get_global_session_memory_detail();
CREATE VIEW dbe_perf.session_cpu_runtime AS
SELECT
S.datid AS datid,
S.usename,
S.pid,
S.query_start AS start_time,
T.min_cpu_time,
T.max_cpu_time,
T.total_cpu_time,
S.query,
S.node_group,
T.top_cpu_dn
FROM pg_stat_activity_ng AS S, pg_catalog.pg_stat_get_wlm_realtime_session_info(NULL) AS T
WHERE S.pid = T.threadid;
CREATE VIEW dbe_perf.session_memory_runtime AS
SELECT
S.datid AS datid,
S.usename,
S.pid,
S.query_start AS start_time,
T.min_peak_memory,
T.max_peak_memory,
T.spill_info,
S.query,
S.node_group,
T.top_mem_dn
FROM pg_stat_activity_ng AS S, pg_catalog.pg_stat_get_wlm_realtime_session_info(NULL) AS T
WHERE S.pid = T.threadid;
CREATE OR REPLACE VIEW dbe_perf.session_stat_activity AS
SELECT
S.datid AS datid,
D.datname AS datname,
S.pid,
S.usesysid,
U.rolname AS usename,
S.application_name,
S.client_addr,
S.client_hostname,
S.client_port,
S.backend_start,
S.xact_start,
S.query_start,
S.state_change,
S.waiting,
S.enqueue,
S.state,
CASE
WHEN S.srespool = 'unknown' THEN (U.rolrespool) :: name
ELSE S.srespool
END AS resource_pool,
S.query_id,
S.query,
S.unique_sql_id,
S.trace_id
FROM pg_database D, pg_catalog.pg_stat_get_activity(NULL) AS S, pg_authid U
WHERE S.datid = D.oid AND
S.usesysid = U.oid;
CREATE OR REPLACE FUNCTION dbe_perf.get_global_session_stat_activity
(out coorname text, out datid oid, out datname text, out pid bigint,
out usesysid oid, out usename text, out application_name text, out client_addr inet,
out client_hostname text, out client_port integer, out backend_start timestamptz,
out xact_start timestamptz, out query_start timestamptz, out state_change timestamptz,
out waiting boolean, out enqueue text, out state text, out resource_pool name,
out query_id bigint, out query text, out unique_sql_id bigint, out trace_id text)
RETURNS setof record
AS $$
DECLARE
row_data dbe_perf.session_stat_activity%rowtype;
coor_name record;
fet_active text;
fetch_coor text;
BEGIN
fetch_coor := 'select * from dbe_perf.node_name';
FOR coor_name IN EXECUTE(fetch_coor) LOOP
coorname := coor_name.node_name;
fet_active := 'SELECT * FROM dbe_perf.session_stat_activity';
FOR row_data IN EXECUTE(fet_active) LOOP
coorname := coorname;
datid :=row_data.datid;
datname := row_data.datname;
pid := row_data.pid;
usesysid :=row_data.usesysid;
usename := row_data.usename;
application_name := row_data.application_name;
client_addr := row_data.client_addr;
client_hostname :=row_data.client_hostname;
client_port :=row_data.client_port;
backend_start := row_data.backend_start;
xact_start := row_data.xact_start;
query_start := row_data.query_start;
state_change := row_data.state_change;
waiting := row_data.waiting;
enqueue := row_data.enqueue;
state := row_data.state;
resource_pool :=row_data.resource_pool;
query_id :=row_data.query_id;
query := row_data.query;
unique_sql_id := row_data.unique_sql_id;
trace_id := row_data.trace_id;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_session_stat_activity AS
SELECT * FROM dbe_perf.get_global_session_stat_activity();
CREATE VIEW dbe_perf.thread_wait_status AS
SELECT * FROM pg_catalog.pg_stat_get_status(NULL);
CREATE OR REPLACE FUNCTION dbe_perf.get_global_thread_wait_status()
RETURNS setof dbe_perf.thread_wait_status
AS $$
DECLARE
row_data dbe_perf.thread_wait_status%rowtype;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.thread_wait_status';
FOR row_data IN EXECUTE(query_str) LOOP
return next row_data;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_thread_wait_status AS
SELECT * FROM dbe_perf.get_global_thread_wait_status();
CREATE VIEW DBE_PERF.wlm_user_resource_runtime AS
SELECT
T.usename AS username,
T.used_memory,
T.total_memory,
T.used_cpu,
T.total_cpu,
T.used_space,
T.total_space,
T.used_temp_space,
T.total_temp_space,
T.used_spill_space,
T.total_spill_space
FROM (select usename, (pg_catalog.gs_wlm_user_resource_info(usename::cstring)).* from pg_user) T;
CREATE VIEW dbe_perf.wlm_user_resource_config AS
SELECT
T.userid,
S.rolname AS username,
T.sysadmin,
T.rpoid,
R.respool_name AS respool,
T.parentid,
T.totalspace,
T.spacelimit,
T.childcount,
T.childlist
FROM pg_authid AS S, pg_catalog.gs_wlm_get_user_info(NULL) AS T, pg_resource_pool AS R
WHERE S.oid = T.userid AND T.rpoid = R.oid;
CREATE VIEW dbe_perf.operator_history_table AS
SELECT * FROM gs_wlm_operator_info;
CREATE OR REPLACE FUNCTION dbe_perf.get_global_operator_history_table()
RETURNS setof dbe_perf.operator_history_table
AS $$
DECLARE
row_data dbe_perf.operator_history_table%rowtype;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.operator_history_table';
FOR row_data IN EXECUTE(query_str) LOOP
return next row_data;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_operator_history_table AS
SELECT * FROM dbe_perf.get_global_operator_history_table();
CREATE VIEW dbe_perf.operator_history AS
SELECT * FROM pg_catalog.pg_stat_get_wlm_operator_info(0);
CREATE OR REPLACE FUNCTION dbe_perf.get_global_operator_history()
RETURNS setof dbe_perf.operator_history
AS $$
DECLARE
row_data dbe_perf.operator_history%rowtype;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.operator_history';
FOR row_data IN EXECUTE(query_str) LOOP
return next row_data;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql';
CREATE VIEW dbe_perf.global_operator_history AS
SELECT * FROM dbe_perf.get_global_operator_history();
CREATE VIEW dbe_perf.operator_runtime AS
SELECT t.*
FROM dbe_perf.session_stat_activity AS s, pg_catalog.pg_stat_get_wlm_realtime_operator_info(NULL) as t
WHERE s.query_id = t.queryid;
CREATE OR REPLACE FUNCTION dbe_perf.get_global_operator_runtime()
RETURNS setof dbe_perf.operator_runtime
AS $$
DECLARE
row_data dbe_perf.operator_runtime%rowtype;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.operator_runtime';
FOR row_data IN EXECUTE(query_str) LOOP
return next row_data;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_operator_runtime AS
SELECT * FROM dbe_perf.get_global_operator_runtime();
CREATE VIEW dbe_perf.statement_complex_history AS
SELECT
S.datid,
S.dbname,
S.schemaname,
S.nodename,
S.username,
S.application_name,
S.client_addr,
S.client_hostname,
S.client_port,
S.query_band,
S.block_time,
S.start_time,
S.finish_time,
S.duration,
S.estimate_total_time,
S.status,
S.abort_info,
S.resource_pool,
S.control_group,
S.estimate_memory,
S.min_peak_memory,
S.max_peak_memory,
S.average_peak_memory,
S.memory_skew_percent,
S.spill_info,
S.min_spill_size,
S.max_spill_size,
S.average_spill_size,
S.spill_skew_percent,
S.min_dn_time,
S.max_dn_time,
S.average_dn_time,
S.dntime_skew_percent,
S.min_cpu_time,
S.max_cpu_time,
S.total_cpu_time,
S.cpu_skew_percent,
S.min_peak_iops,
S.max_peak_iops,
S.average_peak_iops,
S.iops_skew_percent,
S.warning,
S.queryid,
S.query,
S.query_plan,
S.node_group,
S.cpu_top1_node_name,
S.cpu_top2_node_name,
S.cpu_top3_node_name,
S.cpu_top4_node_name,
S.cpu_top5_node_name,
S.mem_top1_node_name,
S.mem_top2_node_name,
S.mem_top3_node_name,
S.mem_top4_node_name,
S.mem_top5_node_name,
S.cpu_top1_value,
S.cpu_top2_value,
S.cpu_top3_value,
S.cpu_top4_value,
S.cpu_top5_value,
S.mem_top1_value,
S.mem_top2_value,
S.mem_top3_value,
S.mem_top4_value,
S.mem_top5_value,
S.top_mem_dn,
S.top_cpu_dn
FROM pg_catalog.pg_stat_get_wlm_session_info(0) S;
CREATE OR REPLACE FUNCTION dbe_perf.get_global_statement_complex_history()
RETURNS setof dbe_perf.statement_complex_history
AS $$
DECLARE
row_data dbe_perf.statement_complex_history%rowtype;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.statement_complex_history';
FOR row_data IN EXECUTE(query_str) LOOP
return next row_data;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_statement_complex_history AS
SELECT * FROM dbe_perf.get_global_statement_complex_history();
CREATE VIEW dbe_perf.statement_complex_history_table AS
SELECT * FROM gs_wlm_session_info;
CREATE OR REPLACE FUNCTION dbe_perf.get_global_statement_complex_history_table()
RETURNS setof dbe_perf.statement_complex_history_table
AS $$
DECLARE
row_data dbe_perf.statement_complex_history_table%rowtype;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.statement_complex_history_table';
FOR row_data IN EXECUTE(query_str) LOOP
return next row_data;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_statement_complex_history_table AS
SELECT * FROM dbe_perf.get_global_statement_complex_history_table();
CREATE VIEW dbe_perf.statement_complex_runtime AS
SELECT
S.datid AS datid,
S.datname AS dbname,
T.schemaname,
T.nodename,
S.usename AS username,
S.application_name,
S.client_addr,
S.client_hostname,
S.client_port,
T.query_band,
S.pid,
T.block_time,
S.query_start AS start_time,
T.duration,
T.estimate_total_time,
T.estimate_left_time,
S.enqueue,
S.resource_pool,
T.control_group,
T.estimate_memory,
T.min_peak_memory,
T.max_peak_memory,
T.average_peak_memory,
T.memory_skew_percent,
T.spill_info,
T.min_spill_size,
T.max_spill_size,
T.average_spill_size,
T.spill_skew_percent,
T.min_dn_time,
T.max_dn_time,
T.average_dn_time,
T.dntime_skew_percent,
T.min_cpu_time,
T.max_cpu_time,
T.total_cpu_time,
T.cpu_skew_percent,
T.min_peak_iops,
T.max_peak_iops,
T.average_peak_iops,
T.iops_skew_percent,
T.warning,
S.query_id AS queryid,
T.query,
T.query_plan,
S.node_group,
T.top_cpu_dn,
T.top_mem_dn
FROM pg_stat_activity_ng AS S, pg_catalog.pg_stat_get_wlm_realtime_session_info(NULL) AS T
WHERE S.pid = T.threadid;
CREATE OR REPLACE FUNCTION dbe_perf.get_global_statement_complex_runtime()
RETURNS setof dbe_perf.statement_complex_runtime
AS $$
DECLARE
row_data dbe_perf.statement_complex_runtime%rowtype;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.statement_complex_runtime';
FOR row_data IN EXECUTE(query_str) LOOP
return next row_data;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_statement_complex_runtime AS
SELECT * FROM dbe_perf.get_global_statement_complex_runtime();
CREATE VIEW dbe_perf.statement_iostat_complex_runtime AS
SELECT
S.query_id,
T.mincurr_iops as mincurriops,
T.maxcurr_iops as maxcurriops,
T.minpeak_iops as minpeakiops,
T.maxpeak_iops as maxpeakiops,
T.iops_limits as io_limits,
CASE WHEN T.io_priority = 0 THEN 'None'::text
WHEN T.io_priority = 20 THEN 'Low'::text
WHEN T.io_priority = 50 THEN 'Medium'::text
WHEN T.io_priority = 80 THEN 'High'::text END AS io_priority,
S.query,
S.node_group,
T.curr_io_limits as curr_io_limits
FROM pg_stat_activity_ng AS S, pg_catalog.pg_stat_get_wlm_session_iostat_info(0) AS T
WHERE S.pid = T.threadid;
CREATE OR REPLACE VIEW dbe_perf.statement_wlmstat_complex_runtime AS
SELECT
S.datid AS datid,
D.datname AS datname,
S.threadid,
S.threadpid AS processid,
S.usesysid,
S.appname,
U.rolname AS usename,
S.priority,
S.attribute,
S.block_time,
S.elapsed_time,
S.total_cpu_time,
S.skew_percent AS cpu_skew_percent,
S.statement_mem,
S.active_points,
S.dop_value,
S.current_cgroup AS control_group,
S.current_status AS status,
S.enqueue_state AS enqueue,
CASE
WHEN T.session_respool = 'unknown' THEN (U.rolrespool) :: name
ELSE T.session_respool
END AS resource_pool,
S.query,
S.is_plana,
S.node_group
FROM pg_database D, pg_catalog.pg_stat_get_session_wlmstat(NULL) AS S, pg_authid AS U, pg_catalog.gs_wlm_session_respool(0) AS T
WHERE S.datid = D.oid AND
S.usesysid = U.oid AND
T.threadid = S.threadid;
CREATE VIEW dbe_perf.memory_node_detail AS
SELECT * FROM pv_total_memory_detail();
CREATE OR REPLACE FUNCTION dbe_perf.get_global_memory_node_detail()
RETURNS setof dbe_perf.memory_node_detail
AS $$
DECLARE
row_name record;
row_data dbe_perf.memory_node_detail%rowtype;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.memory_node_detail';
FOR row_data IN EXECUTE(query_str) LOOP
RETURN NEXT row_data;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_memory_node_detail AS
SELECT DISTINCT * FROM dbe_perf.get_global_memory_node_detail();
CREATE VIEW dbe_perf.shared_memory_detail AS
SELECT * FROM pg_shared_memory_detail();
CREATE OR REPLACE FUNCTION dbe_perf.get_global_shared_memory_detail
(OUT node_name name, OUT contextname text, OUT level smallint, OUT parent text,
OUT totalsize bigint, OUT freesize bigint, OUT usedsize bigint)
RETURNS setof record
AS $$
DECLARE
row_name record;
row_data dbe_perf.shared_memory_detail%rowtype;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.shared_memory_detail';
FOR row_data IN EXECUTE(query_str) LOOP
node_name := row_name.node_name;
contextname := row_data.contextname;
level := row_data.level;
parent := row_data.parent;
totalsize := row_data.totalsize;
freesize := row_data.freesize;
usedsize := row_data.usedsize;
RETURN NEXT;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_shared_memory_detail AS
SELECT DISTINCT * FROM dbe_perf.get_global_shared_memory_detail();
CREATE VIEW dbe_perf.statio_all_indexes AS
SELECT
C.oid AS relid,
I.oid AS indexrelid,
N.nspname AS schemaname,
C.relname AS relname,
I.relname AS indexrelname,
pg_catalog.pg_stat_get_blocks_fetched(I.oid) -
pg_catalog.pg_stat_get_blocks_hit(I.oid) AS idx_blks_read,
pg_catalog.pg_stat_get_blocks_hit(I.oid) AS idx_blks_hit
FROM pg_class C JOIN
pg_index X ON C.oid = X.indrelid JOIN
pg_class I ON I.oid = X.indexrelid
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
WHERE C.relkind IN ('r', 't');
CREATE OR REPLACE FUNCTION dbe_perf.get_global_statio_all_indexes
(OUT node_name name, OUT relid oid, OUT indexrelid oid, OUT schemaname name,
OUT relname name, OUT indexrelname name, OUT idx_blks_read numeric, OUT idx_blks_hit numeric)
RETURNS setof record
AS $$
DECLARE
row_data record;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.statio_all_indexes';
FOR row_data IN EXECUTE(query_str) LOOP
node_name := row_name.node_name;
relid := row_data.relid;
indexrelid := row_data.indexrelid;
schemaname := row_data.schemaname;
relname := row_data.relname;
indexrelname := row_data.indexrelname;
idx_blks_read := row_data.idx_blks_read;
idx_blks_hit := row_data.idx_blks_hit;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_statio_all_indexes AS
SELECT * FROM dbe_perf.get_global_statio_all_indexes();
CREATE OR REPLACE FUNCTION dbe_perf.get_local_toastname_and_toastindexname(OUT shemaname name, OUT relname name, OUT toastname name, OUT toastindexname name)
RETURNS setof record
AS $$
DECLARE
query_str text;
BEGIN
query_str := '
SELECT
N.nspname AS shemaname,
S.relname AS relname,
T.relname AS toastname,
CI.relname AS toastindexname
FROM pg_class S JOIN pg_namespace N ON N.oid = S.relnamespace
LEFT JOIN pg_class T on T.oid = S.reltoastrelid
JOIN pg_index I ON T.oid = I.indrelid
JOIN pg_class CI ON CI.oid = I.indexrelid
WHERE S.relkind IN (''r'', ''t'') AND T.relname is not NULL';
return query execute query_str;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE OR REPLACE FUNCTION dbe_perf.get_summary_statio_all_indexes
(OUT schemaname name, OUT toastrelschemaname name, OUT toastrelname name,
OUT relname name, OUT indexrelname name, OUT idx_blks_read numeric, OUT idx_blks_hit numeric)
RETURNS setof record
AS $$
DECLARE
row_data record;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := '
SELECT
T.relname AS relname,
T.schemaname AS schemaname,
C.relname AS toastrelname,
N.nspname AS toastrelschemaname,
T.indexrelname AS indexrelname,
T.idx_blks_read AS idx_blks_read,
T.idx_blks_hit AS idx_blks_hit
FROM dbe_perf.statio_all_indexes T
LEFT JOIN pg_class C ON T.relid = C.reltoastrelid
LEFT JOIN pg_namespace N ON C.relnamespace = N.oid';
FOR row_data IN EXECUTE(query_str) LOOP
schemaname := row_data.schemaname;
IF row_data.toastrelname IS NULL THEN
relname := row_data.relname;
indexrelname := row_data.indexrelname;
ELSE
relname := NULL;
indexrelname := NULL;
END IF;
toastrelschemaname := row_data.toastrelschemaname;
toastrelname := row_data.toastrelname;
idx_blks_read := row_data.idx_blks_read;
idx_blks_hit := row_data.idx_blks_hit;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.summary_statio_all_indexes AS
SELECT Ti.schemaname, COALESCE(Ti.relname, Tn.toastname) AS relname,
COALESCE(Ti.indexrelname, Tn.toastindexname) AS indexrelname,
pg_catalog.SUM(Ti.idx_blks_read) idx_blks_read, pg_catalog.SUM(Ti.idx_blks_hit) idx_blks_hit
FROM dbe_perf.get_summary_statio_all_indexes() as Ti
LEFT JOIN dbe_perf.get_local_toastname_and_toastindexname() AS Tn
ON (Tn.shemaname = Ti.toastrelschemaname AND Tn.relname = Ti.toastrelname)
GROUP BY (1, 2, 3);
CREATE VIEW dbe_perf.statio_all_sequences AS
SELECT
C.oid AS relid,
N.nspname AS schemaname,
C.relname AS relname,
pg_catalog.pg_stat_get_blocks_fetched(C.oid) -
pg_catalog.pg_stat_get_blocks_hit(C.oid) AS blks_read,
pg_catalog.pg_stat_get_blocks_hit(C.oid) AS blks_hit
FROM pg_class C
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
WHERE C.relkind = 'S' or C.relkind = 'L';
CREATE OR REPLACE FUNCTION dbe_perf.get_global_statio_all_sequences
(OUT node_name name, OUT relid oid, OUT schemaname name,
OUT relname name, OUT blks_read bigint, OUT blks_hit bigint)
RETURNS setof record
AS $$
DECLARE
row_data record;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.statio_all_sequences';
FOR row_data IN EXECUTE(query_str) LOOP
node_name := row_name.node_name;
relid := row_data.relid;
schemaname := row_data.schemaname;
relname := row_data.relname;
blks_read := row_data.blks_read;
blks_hit := row_data.blks_hit;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_statio_all_sequences AS
SELECT * FROM dbe_perf.get_global_statio_all_sequences();
CREATE VIEW dbe_perf.summary_statio_all_sequences AS
SELECT schemaname, relname,
pg_catalog.SUM(blks_read) blks_read, pg_catalog.SUM(blks_hit) blks_hit
FROM dbe_perf.get_global_statio_all_sequences()
GROUP BY (schemaname, relname);
CREATE VIEW dbe_perf.statio_all_tables AS
SELECT
C.oid AS relid,
N.nspname AS schemaname,
C.relname AS relname,
pg_catalog.pg_stat_get_blocks_fetched(C.oid) -
pg_catalog.pg_stat_get_blocks_hit(C.oid) AS heap_blks_read,
pg_catalog.pg_stat_get_blocks_hit(C.oid) AS heap_blks_hit,
pg_catalog.sum(pg_catalog.pg_stat_get_blocks_fetched(I.indexrelid) -
pg_catalog.pg_stat_get_blocks_hit(I.indexrelid))::bigint AS idx_blks_read,
pg_catalog.sum(pg_catalog.pg_stat_get_blocks_hit(I.indexrelid))::bigint AS idx_blks_hit,
pg_catalog.pg_stat_get_blocks_fetched(T.oid) -
pg_catalog.pg_stat_get_blocks_hit(T.oid) AS toast_blks_read,
pg_catalog.pg_stat_get_blocks_hit(T.oid) AS toast_blks_hit,
pg_catalog.pg_stat_get_blocks_fetched(X.oid) -
pg_catalog.pg_stat_get_blocks_hit(X.oid) AS tidx_blks_read,
pg_catalog.pg_stat_get_blocks_hit(X.oid) AS tidx_blks_hit
FROM pg_class C LEFT JOIN
pg_index I ON C.oid = I.indrelid LEFT JOIN
pg_class T ON C.reltoastrelid = T.oid LEFT JOIN
pg_class X ON T.reltoastidxid = X.oid
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
WHERE C.relkind IN ('r', 't')
GROUP BY C.oid, N.nspname, C.relname, T.oid, X.oid;
CREATE OR REPLACE FUNCTION dbe_perf.get_global_statio_all_tables
(OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT heap_blks_read bigint,
OUT heap_blks_hit bigint, OUT idx_blks_read bigint, OUT idx_blks_hit bigint, OUT toast_blks_read bigint,
OUT toast_blks_hit bigint, OUT tidx_blks_read bigint, OUT tidx_blks_hit bigint)
RETURNS setof record
AS $$
DECLARE
row_data record;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.statio_all_tables';
FOR row_data IN EXECUTE(query_str) LOOP
node_name := row_name.node_name;
relid := row_data.relid;
schemaname := row_data.schemaname;
relname := row_data.relname;
heap_blks_read := row_data.heap_blks_read;
heap_blks_hit := row_data.heap_blks_hit;
idx_blks_read := row_data.idx_blks_read;
idx_blks_hit := row_data.idx_blks_hit;
toast_blks_read := row_data.toast_blks_read;
toast_blks_hit := row_data.toast_blks_hit;
tidx_blks_read := row_data.tidx_blks_read;
tidx_blks_hit := row_data.tidx_blks_hit;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_statio_all_tables AS
SELECT * FROM dbe_perf.get_global_statio_all_tables();
CREATE OR REPLACE FUNCTION dbe_perf.get_summary_statio_all_tables
(OUT schemaname name, OUT relname name, OUT toastrelschemaname name, OUT toastrelname name, OUT heap_blks_read bigint,
OUT heap_blks_hit bigint, OUT idx_blks_read bigint, OUT idx_blks_hit bigint, OUT toast_blks_read bigint,
OUT toast_blks_hit bigint, OUT tidx_blks_read bigint, OUT tidx_blks_hit bigint)
RETURNS setof record
AS $$
DECLARE
row_data record;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := '
SELECT
C.relname AS relname,
C.schemaname AS schemaname,
O.relname AS toastrelname,
N.nspname AS toastrelschemaname,
C.heap_blks_read AS heap_blks_read,
C.heap_blks_hit AS heap_blks_hit,
C.idx_blks_read AS idx_blks_read,
C.idx_blks_hit AS idx_blks_hit,
C.toast_blks_read AS toast_blks_read,
C.toast_blks_hit AS toast_blks_hit,
C.tidx_blks_read AS tidx_blks_read,
C.tidx_blks_hit AS tidx_blks_hit
FROM dbe_perf.statio_all_tables C
LEFT JOIN pg_class O ON C.relid = O.reltoastrelid
LEFT JOIN pg_namespace N ON O.relnamespace = N.oid';
FOR row_data IN EXECUTE(query_str) LOOP
schemaname := row_data.schemaname;
IF row_data.toastrelname IS NULL THEN
relname := row_data.relname;
ELSE
relname := NULL;
END IF;
toastrelschemaname := row_data.toastrelschemaname;
toastrelname := row_data.toastrelname;
heap_blks_read := row_data.heap_blks_read;
heap_blks_hit := row_data.heap_blks_hit;
idx_blks_read := row_data.idx_blks_read;
idx_blks_hit := row_data.idx_blks_hit;
toast_blks_read := row_data.toast_blks_read;
toast_blks_hit := row_data.toast_blks_hit;
tidx_blks_read := row_data.tidx_blks_read;
tidx_blks_hit := row_data.tidx_blks_hit;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE OR REPLACE FUNCTION dbe_perf.get_local_toast_relation(OUT shemaname name, OUT relname name, OUT toastname name)
RETURNS setof record
AS $$
DECLARE
query_str text;
BEGIN
query_str := '
SELECT
N.nspname as shemaname,
S.relname as relname,
T.relname as toastname
FROM pg_class S JOIN pg_namespace N ON N.oid = S.relnamespace
LEFT JOIN pg_class T on T.oid=S.reltoastrelid
WHERE T.relname is not NULL';
return query execute query_str;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.summary_statio_all_tables AS
SELECT Ti.schemaname as schemaname, COALESCE(Ti.relname, Tn.toastname) as relname,
pg_catalog.SUM(Ti.heap_blks_read) heap_blks_read, pg_catalog.SUM(Ti.heap_blks_hit) heap_blks_hit,
pg_catalog.SUM(Ti.idx_blks_read) idx_blks_read, pg_catalog.SUM(Ti.idx_blks_hit) idx_blks_hit,
pg_catalog.SUM(Ti.toast_blks_read) toast_blks_read, pg_catalog.SUM(Ti.toast_blks_hit) toast_blks_hit,
pg_catalog.SUM(Ti.tidx_blks_read) tidx_blks_read, pg_catalog.SUM(Ti.tidx_blks_hit) tidx_blks_hit
FROM dbe_perf.get_summary_statio_all_tables() Ti left join dbe_perf.get_local_toast_relation() Tn on Tn.shemaname = Ti.toastrelschemaname and Tn.relname = Ti.toastrelname
GROUP BY (1, 2);
CREATE VIEW dbe_perf.statio_sys_indexes AS
SELECT * FROM dbe_perf.statio_all_indexes
WHERE schemaname IN ('pg_catalog', 'information_schema', 'snapshot') OR
schemaname ~ '^pg_toast';
CREATE OR REPLACE FUNCTION dbe_perf.get_global_statio_sys_indexes
(OUT node_name name, OUT relid oid, OUT indexrelid oid, OUT schemaname name,
OUT relname name, OUT indexrelname name, OUT idx_blks_read numeric, OUT idx_blks_hit numeric)
RETURNS setof record
AS $$
DECLARE
row_data record;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.statio_sys_indexes';
FOR row_data IN EXECUTE(query_str) LOOP
node_name := row_name.node_name;
relid := row_data.relid;
indexrelid := row_data.indexrelid;
schemaname := row_data.schemaname;
relname := row_data.relname;
indexrelname := row_data.indexrelname;
idx_blks_read := row_data.idx_blks_read;
idx_blks_hit := row_data.idx_blks_hit;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_statio_sys_indexes AS
SELECT * FROM dbe_perf.get_global_statio_sys_indexes();
CREATE OR REPLACE FUNCTION dbe_perf.get_summary_statio_sys_indexes
(OUT schemaname name, OUT toastrelschemaname name, OUT toastrelname name,
OUT relname name, OUT indexrelname name, OUT idx_blks_read numeric, OUT idx_blks_hit numeric)
RETURNS setof record
AS $$
DECLARE
row_data record;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := '
SELECT
T.relname AS relname,
T.schemaname AS schemaname,
C.relname AS toastrelname,
N.nspname AS toastrelschemaname,
T.indexrelname AS indexrelname,
T.idx_blks_read AS idx_blks_read,
T.idx_blks_hit AS idx_blks_hit
FROM dbe_perf.statio_sys_indexes T
LEFT JOIN pg_class C ON T.relid = C.reltoastrelid
LEFT JOIN pg_namespace N ON C.relnamespace = N.oid';
FOR row_data IN EXECUTE(query_str) LOOP
schemaname := row_data.schemaname;
IF row_data.toastrelname IS NULL THEN
relname := row_data.relname;
indexrelname := row_data.indexrelname;
ELSE
relname := NULL;
indexrelname := NULL;
END IF;
toastrelschemaname := row_data.toastrelschemaname;
toastrelname := row_data.toastrelname;
idx_blks_read := row_data.idx_blks_read;
idx_blks_hit := row_data.idx_blks_hit;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.summary_statio_sys_indexes AS
SELECT Ti.schemaname, COALESCE(Ti.relname, Tn.toastname) AS relname,
COALESCE(Ti.indexrelname, Tn.toastindexname) AS indexrelname,
pg_catalog.SUM(Ti.idx_blks_read) idx_blks_read, pg_catalog.SUM(Ti.idx_blks_hit) idx_blks_hit
FROM dbe_perf.get_summary_statio_sys_indexes() AS Ti
LEFT JOIN dbe_perf.get_local_toastname_and_toastindexname() AS Tn
ON (Tn.shemaname = Ti.toastrelschemaname AND Tn.relname = Ti.toastrelname)
GROUP BY (1, 2, 3);
CREATE VIEW dbe_perf.statio_sys_sequences AS
SELECT * FROM dbe_perf.statio_all_sequences
WHERE schemaname IN ('pg_catalog', 'information_schema') OR
schemaname ~ '^pg_toast';
CREATE OR REPLACE FUNCTION dbe_perf.get_global_statio_sys_sequences
(OUT node_name name, OUT relid oid, OUT schemaname name,
OUT relname name, OUT blks_read bigint, OUT blks_hit bigint)
RETURNS setof record
AS $$
DECLARE
row_data record;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.statio_sys_sequences';
FOR row_data IN EXECUTE(query_str) LOOP
node_name := row_name.node_name;
relid := row_data.relid;
schemaname := row_data.schemaname;
relname := row_data.relname;
blks_read := row_data.blks_read;
blks_hit := row_data.blks_hit;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_statio_sys_sequences AS
SELECT * FROM dbe_perf.get_global_statio_sys_sequences();
CREATE VIEW dbe_perf.summary_statio_sys_sequences AS
SELECT schemaname, relname,
pg_catalog.SUM(blks_read) blks_read, pg_catalog.SUM(blks_hit) blks_hit
FROM dbe_perf.get_global_statio_sys_sequences()
GROUP BY (schemaname, relname);
CREATE VIEW dbe_perf.statio_sys_tables AS
SELECT * FROM dbe_perf.statio_all_tables
WHERE schemaname IN ('pg_catalog', 'information_schema', 'snapshot') OR
schemaname ~ '^pg_toast';
CREATE OR REPLACE FUNCTION dbe_perf.get_global_statio_sys_tables
(OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT heap_blks_read bigint,
OUT heap_blks_hit bigint, OUT idx_blks_read bigint, OUT idx_blks_hit bigint, OUT toast_blks_read bigint,
OUT toast_blks_hit bigint, OUT tidx_blks_read bigint, OUT tidx_blks_hit bigint)
RETURNS setof record
AS $$
DECLARE
row_data record;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.statio_sys_tables';
FOR row_data IN EXECUTE(query_str) LOOP
node_name := row_name.node_name;
relid := row_data.relid;
schemaname := row_data.schemaname;
relname := row_data.relname;
heap_blks_read := row_data.heap_blks_read;
heap_blks_hit := row_data.heap_blks_hit;
idx_blks_read := row_data.idx_blks_read;
idx_blks_hit := row_data.idx_blks_hit;
toast_blks_read := row_data.toast_blks_read;
toast_blks_hit := row_data.toast_blks_hit;
tidx_blks_read := row_data.tidx_blks_read;
tidx_blks_hit := row_data.tidx_blks_hit;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_statio_sys_tables AS
SELECT * FROM dbe_perf.get_global_statio_sys_tables();
CREATE OR REPLACE FUNCTION dbe_perf.get_summary_statio_sys_tables
(OUT schemaname name, OUT relname name,
OUT toastrelschemaname name, OUT toastrelname name,
OUT heap_blks_read bigint, OUT heap_blks_hit bigint,
OUT idx_blks_read bigint, OUT idx_blks_hit bigint,
OUT toast_blks_read bigint, OUT toast_blks_hit bigint,
OUT tidx_blks_read bigint, OUT tidx_blks_hit bigint)
RETURNS setof record
AS $$
DECLARE
row_data record;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := '
SELECT
C.schemaname AS schemaname,
C.relname AS relname,
O.relname AS toastrelname,
N.nspname AS toastrelschemaname,
C.heap_blks_read AS heap_blks_read,
C.heap_blks_hit AS heap_blks_hit,
C.idx_blks_read AS idx_blks_read,
C.idx_blks_hit AS idx_blks_hit,
C.toast_blks_read AS toast_blks_read,
C.toast_blks_hit AS toast_blks_hit,
C.tidx_blks_read AS tidx_blks_read,
C.tidx_blks_hit AS tidx_blks_hit
FROM dbe_perf.statio_sys_tables C
LEFT JOIN pg_class O ON C.relid = O.reltoastrelid
LEFT JOIN pg_namespace N ON O.relnamespace = N.oid';
FOR row_data IN EXECUTE(query_str) LOOP
schemaname := row_data.schemaname;
IF row_data.toastrelname IS NULL THEN
relname := row_data.relname;
ELSE
relname := NULL;
END IF;
toastrelschemaname := row_data.toastrelschemaname;
toastrelname := row_data.toastrelname;
heap_blks_read := row_data.heap_blks_read;
heap_blks_hit := row_data.heap_blks_hit;
idx_blks_read := row_data.idx_blks_read;
idx_blks_hit := row_data.idx_blks_hit;
toast_blks_read := row_data.toast_blks_read;
toast_blks_hit := row_data.toast_blks_hit;
tidx_blks_read := row_data.tidx_blks_read;
tidx_blks_hit := row_data.tidx_blks_hit;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.summary_statio_sys_tables AS
SELECT
Ti.schemaname, COALESCE(Ti.relname, Tn.toastname, NULL) as relname,
pg_catalog.SUM(Ti.heap_blks_read) heap_blks_read, pg_catalog.SUM(Ti.heap_blks_hit) heap_blks_hit,
pg_catalog.SUM(Ti.idx_blks_read) idx_blks_read, pg_catalog.SUM(Ti.idx_blks_hit) idx_blks_hit,
pg_catalog.SUM(Ti.toast_blks_read) toast_blks_read, pg_catalog.SUM(Ti.toast_blks_hit) toast_blks_hit,
pg_catalog.SUM(Ti.tidx_blks_read) tidx_blks_read, pg_catalog.SUM(Ti.tidx_blks_hit) tidx_blks_hit
FROM dbe_perf.get_summary_statio_sys_tables() as Ti
LEFT JOIN dbe_perf.get_local_toast_relation() Tn
ON Tn.shemaname = Ti.toastrelschemaname AND Tn.relname = Ti.toastrelname
GROUP BY (1, 2);
CREATE VIEW dbe_perf.statio_user_indexes AS
SELECT * FROM dbe_perf.statio_all_indexes
WHERE schemaname NOT IN ('pg_catalog', 'information_schema', 'snapshot') AND
schemaname !~ '^pg_toast';
CREATE OR REPLACE FUNCTION dbe_perf.get_global_statio_user_indexes
(OUT node_name name, OUT relid oid, OUT indexrelid oid, OUT schemaname name,
OUT relname name, OUT indexrelname name, OUT idx_blks_read numeric, OUT idx_blks_hit numeric)
RETURNS setof record
AS $$
DECLARE
row_data record;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.statio_user_indexes';
FOR row_data IN EXECUTE(query_str) LOOP
node_name := row_name.node_name;
relid := row_data.relid;
indexrelid := row_data.indexrelid;
schemaname := row_data.schemaname;
relname := row_data.relname;
indexrelname := row_data.indexrelname;
idx_blks_read := row_data.idx_blks_read;
idx_blks_hit := row_data.idx_blks_hit;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_statio_user_indexes AS
SELECT * FROM dbe_perf.get_global_statio_user_indexes();
CREATE OR REPLACE FUNCTION dbe_perf.get_summary_statio_user_indexes
(OUT schemaname name, OUT toastrelschemaname name, OUT toastrelname name,
OUT relname name, OUT indexrelname name, OUT idx_blks_read numeric, OUT idx_blks_hit numeric)
RETURNS setof record
AS $$
DECLARE
row_data record;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := '
SELECT
T.relname AS relname,
T.schemaname AS schemaname,
C.relname AS toastrelname,
N.nspname AS toastrelschemaname,
T.indexrelname AS indexrelname,
T.idx_blks_read AS idx_blks_read,
T.idx_blks_hit AS idx_blks_hit
FROM dbe_perf.statio_user_indexes T
LEFT JOIN pg_class C ON T.relid = C.reltoastrelid
LEFT JOIN pg_namespace N ON C.relnamespace = N.oid';
FOR row_data IN EXECUTE(query_str) LOOP
schemaname := row_data.schemaname;
IF row_data.toastrelname IS NULL THEN
relname := row_data.relname;
indexrelname := row_data.indexrelname;
ELSE
relname := NULL;
indexrelname := NULL;
END IF;
toastrelschemaname := row_data.toastrelschemaname;
toastrelname := row_data.toastrelname;
idx_blks_read := row_data.idx_blks_read;
idx_blks_hit := row_data.idx_blks_hit;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.summary_statio_user_indexes AS
SELECT
Ti.schemaname, COALESCE(Ti.relname, Tn.toastname) AS relname,
COALESCE(Ti.indexrelname, Tn.toastindexname) AS indexrelname,
pg_catalog.SUM(Ti.idx_blks_read) idx_blks_read, pg_catalog.SUM(Ti.idx_blks_hit) idx_blks_hit
FROM dbe_perf.get_summary_statio_user_indexes() AS Ti
LEFT JOIN dbe_perf.get_local_toastname_and_toastindexname() AS Tn
ON (Tn.shemaname = Ti.toastrelschemaname AND Tn.relname = Ti.toastrelname)
GROUP BY (1, 2, 3);
CREATE VIEW dbe_perf.statio_user_sequences AS
SELECT * FROM dbe_perf.statio_all_sequences
WHERE schemaname NOT IN ('pg_catalog', 'information_schema') AND
schemaname !~ '^pg_toast';
CREATE OR REPLACE FUNCTION dbe_perf.get_global_statio_user_sequences
(OUT node_name name, OUT relid oid, OUT schemaname name,
OUT relname name, OUT blks_read bigint, OUT blks_hit bigint)
RETURNS setof record
AS $$
DECLARE
row_data record;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.statio_user_sequences';
FOR row_data IN EXECUTE(query_str) LOOP
node_name := row_name.node_name;
relid := row_data.relid;
schemaname := row_data.schemaname;
relname := row_data.relname;
blks_read := row_data.blks_read;
blks_hit := row_data.blks_hit;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_statio_user_sequences AS
SELECT * FROM dbe_perf.get_global_statio_user_sequences();
CREATE VIEW dbe_perf.summary_statio_user_sequences AS
SELECT schemaname, relname,
pg_catalog.SUM(blks_read) blks_read, pg_catalog.SUM(blks_hit) blks_hit
FROM dbe_perf.get_global_statio_user_sequences()
GROUP BY (schemaname, relname);
CREATE VIEW dbe_perf.statio_user_tables AS
SELECT * FROM dbe_perf.statio_all_tables
WHERE schemaname NOT IN ('pg_catalog', 'information_schema', 'snapshot') AND
schemaname !~ '^pg_toast';
CREATE OR REPLACE FUNCTION dbe_perf.get_global_statio_user_tables
(OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT heap_blks_read bigint,
OUT heap_blks_hit bigint, OUT idx_blks_read bigint, OUT idx_blks_hit bigint, OUT toast_blks_read bigint,
OUT toast_blks_hit bigint, OUT tidx_blks_read bigint, OUT tidx_blks_hit bigint)
RETURNS setof record
AS $$
DECLARE
row_data record;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.statio_user_tables';
FOR row_data IN EXECUTE(query_str) LOOP
node_name := row_name.node_name;
relid := row_data.relid;
schemaname := row_data.schemaname;
relname := row_data.relname;
heap_blks_read := row_data.heap_blks_read;
heap_blks_hit := row_data.heap_blks_hit;
idx_blks_read := row_data.idx_blks_read;
idx_blks_hit := row_data.idx_blks_hit;
toast_blks_read := row_data.toast_blks_read;
toast_blks_hit := row_data.toast_blks_hit;
tidx_blks_read := row_data.tidx_blks_read;
tidx_blks_hit := row_data.tidx_blks_hit;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_statio_user_tables AS
SELECT * FROM dbe_perf.get_global_statio_user_tables();
CREATE OR REPLACE FUNCTION dbe_perf.get_summary_statio_user_tables
(OUT schemaname name, OUT relname name,
OUT toastrelschemaname name, OUT toastrelname name,
OUT heap_blks_read bigint, OUT heap_blks_hit bigint,
OUT idx_blks_read bigint, OUT idx_blks_hit bigint,
OUT toast_blks_read bigint, OUT toast_blks_hit bigint,
OUT tidx_blks_read bigint, OUT tidx_blks_hit bigint)
RETURNS setof record
AS $$
DECLARE
row_data record;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := '
SELECT
C.schemaname AS schemaname,
C.relname AS relname,
O.relname AS toastrelname,
N.nspname AS toastrelschemaname,
C.heap_blks_read AS heap_blks_read,
C.heap_blks_hit AS heap_blks_hit,
C.idx_blks_read AS idx_blks_read,
C.idx_blks_hit AS idx_blks_hit,
C.toast_blks_read AS toast_blks_read,
C.toast_blks_hit AS toast_blks_hit,
C.tidx_blks_read AS tidx_blks_read,
C.tidx_blks_hit AS tidx_blks_hit
FROM dbe_perf.statio_user_tables C
LEFT JOIN pg_class O ON C.relid = O.reltoastrelid
LEFT JOIN pg_namespace N ON O.relnamespace = N.oid';
FOR row_data IN EXECUTE(query_str) LOOP
schemaname := row_data.schemaname;
IF row_data.toastrelname IS NULL THEN
relname := row_data.relname;
ELSE
relname := NULL;
END IF;
toastrelschemaname := row_data.toastrelschemaname;
toastrelname := row_data.toastrelname;
heap_blks_read := row_data.heap_blks_read;
heap_blks_hit := row_data.heap_blks_hit;
idx_blks_read := row_data.idx_blks_read;
idx_blks_hit := row_data.idx_blks_hit;
toast_blks_read := row_data.toast_blks_read;
toast_blks_hit := row_data.toast_blks_hit;
tidx_blks_read := row_data.tidx_blks_read;
tidx_blks_hit := row_data.tidx_blks_hit;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.summary_statio_user_tables AS
SELECT Ti.schemaname as schemaname, COALESCE(Ti.relname, Tn.toastname) as relname,
pg_catalog.SUM(Ti.heap_blks_read) heap_blks_read, pg_catalog.SUM(Ti.heap_blks_hit) heap_blks_hit,
pg_catalog.SUM(Ti.idx_blks_read) idx_blks_read, pg_catalog.SUM(Ti.idx_blks_hit) idx_blks_hit,
pg_catalog.SUM(Ti.toast_blks_read) toast_blks_read, pg_catalog.SUM(Ti.toast_blks_hit) toast_blks_hit,
pg_catalog.SUM(Ti.tidx_blks_read) tidx_blks_read, pg_catalog.SUM(Ti.tidx_blks_hit) tidx_blks_hit
FROM dbe_perf.get_summary_statio_user_tables() AS Ti LEFT JOIN dbe_perf.get_local_toast_relation() Tn
ON Tn.shemaname = Ti.toastrelschemaname AND Tn.relname = Ti.toastrelname
GROUP BY (1, 2);
CREATE OR REPLACE FUNCTION dbe_perf.get_stat_db_cu
(OUT node_name1 text, OUT db_name text,
OUT mem_hit bigint, OUT hdd_sync_read bigint,
OUT hdd_asyn_read bigint)
RETURNS setof record
AS $$
DECLARE
row_name record;
each_node_out record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT D.datname AS datname,
pg_catalog.pg_stat_get_db_cu_mem_hit(D.oid) AS mem_hit,
pg_catalog.pg_stat_get_db_cu_hdd_sync(D.oid) AS hdd_sync_read,
pg_catalog.pg_stat_get_db_cu_hdd_asyn(D.oid) AS hdd_asyn_read
FROM pg_database D;';
FOR each_node_out IN EXECUTE(query_str) LOOP
node_name1 := row_name.node_name;
db_name := each_node_out.datname;
mem_hit := each_node_out.mem_hit;
hdd_sync_read := each_node_out.hdd_sync_read;
hdd_asyn_read := each_node_out.hdd_asyn_read;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_stat_db_cu AS
SELECT * FROM dbe_perf.get_stat_db_cu();
CREATE VIEW dbe_perf.global_stat_session_cu AS
SELECT * FROM pg_stat_session_cu();
CREATE VIEW dbe_perf.stat_all_tables AS
SELECT
C.oid AS relid,
N.nspname AS schemaname,
C.relname AS relname,
pg_catalog.pg_stat_get_numscans(C.oid) AS seq_scan,
pg_catalog.pg_stat_get_tuples_returned(C.oid) AS seq_tup_read,
pg_catalog.sum(pg_catalog.pg_stat_get_numscans(I.indexrelid))::bigint AS idx_scan,
pg_catalog.sum(pg_catalog.pg_stat_get_tuples_fetched(I.indexrelid))::bigint +
pg_catalog.pg_stat_get_tuples_fetched(C.oid) AS idx_tup_fetch,
pg_catalog.pg_stat_get_tuples_inserted(C.oid) AS n_tup_ins,
pg_catalog.pg_stat_get_tuples_updated(C.oid) AS n_tup_upd,
pg_catalog.pg_stat_get_tuples_deleted(C.oid) AS n_tup_del,
pg_catalog.pg_stat_get_tuples_hot_updated(C.oid) AS n_tup_hot_upd,
pg_catalog.pg_stat_get_live_tuples(C.oid) AS n_live_tup,
pg_catalog.pg_stat_get_dead_tuples(C.oid) AS n_dead_tup,
pg_catalog.pg_stat_get_last_vacuum_time(C.oid) as last_vacuum,
pg_catalog.pg_stat_get_last_autovacuum_time(C.oid) as last_autovacuum,
pg_catalog.pg_stat_get_last_analyze_time(C.oid) as last_analyze,
pg_catalog.pg_stat_get_last_autoanalyze_time(C.oid) as last_autoanalyze,
pg_catalog.pg_stat_get_vacuum_count(C.oid) AS vacuum_count,
pg_catalog.pg_stat_get_autovacuum_count(C.oid) AS autovacuum_count,
pg_catalog.pg_stat_get_analyze_count(C.oid) AS analyze_count,
pg_catalog.pg_stat_get_autoanalyze_count(C.oid) AS autoanalyze_count
FROM pg_class C LEFT JOIN
pg_index I ON C.oid = I.indrelid
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
WHERE C.relkind IN ('r', 't')
GROUP BY C.oid, N.nspname, C.relname;
CREATE OR REPLACE FUNCTION dbe_perf.get_global_stat_all_tables
(OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name,
OUT seq_scan bigint, OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint,
OUT n_tup_ins bigint, OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint,
OUT n_dead_tup bigint, OUT last_vacuum timestamp with time zone, OUT last_autovacuum timestamp with time zone,
OUT last_analyze timestamp with time zone, OUT last_autoanalyze timestamp with time zone, OUT vacuum_count bigint,
OUT autovacuum_count bigint, OUT analyze_count bigint, OUT autoanalyze_count bigint)
RETURNS setof record
AS $$
DECLARE
row_data record;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.stat_all_tables';
FOR row_data IN EXECUTE(query_str) LOOP
node_name := row_name.node_name;
relid := row_data.relid;
schemaname := row_data.schemaname;
relname := row_data.relname;
seq_scan := row_data.seq_scan;
seq_tup_read := row_data.seq_tup_read;
idx_scan := row_data.idx_scan;
idx_tup_fetch := row_data.idx_tup_fetch;
n_tup_ins := row_data.n_tup_ins;
n_tup_upd := row_data.n_tup_upd;
n_tup_del := row_data.n_tup_del;
n_tup_hot_upd := row_data.n_tup_hot_upd;
n_live_tup := row_data.n_live_tup;
n_dead_tup := row_data.n_dead_tup;
last_vacuum := row_data.last_vacuum;
last_autovacuum := row_data.last_autovacuum;
last_analyze := row_data.last_analyze;
last_autoanalyze := row_data.last_autoanalyze;
vacuum_count := row_data.vacuum_count;
autovacuum_count := row_data.autovacuum_count;
analyze_count := row_data.analyze_count;
autoanalyze_count := row_data.autoanalyze_count;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_stat_all_tables AS
SELECT * FROM dbe_perf.get_global_stat_all_tables();
CREATE OR REPLACE FUNCTION dbe_perf.get_summary_stat_all_tables
(OUT schemaname name, OUT relname name,
OUT toastrelschemaname name, OUT toastrelname name,
OUT seq_scan bigint, OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint,
OUT n_tup_ins bigint, OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint,
OUT n_dead_tup bigint, OUT last_vacuum timestamp with time zone, OUT last_autovacuum timestamp with time zone,
OUT last_analyze timestamp with time zone, OUT last_autoanalyze timestamp with time zone, OUT vacuum_count bigint,
OUT autovacuum_count bigint, OUT analyze_count bigint, OUT autoanalyze_count bigint)
RETURNS setof record
AS $$
DECLARE
row_data record;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := '
SELECT
T.schemaname AS schemaname,
T.relname AS relname,
C.relname AS toastrelname,
N.nspname AS toastrelschemaname,
T.seq_scan AS seq_scan,
T.seq_tup_read AS seq_tup_read,
T.idx_scan AS idx_scan,
T.idx_tup_fetch AS idx_tup_fetch,
T.n_tup_ins AS n_tup_ins,
T.n_tup_upd AS n_tup_upd,
T.n_tup_del AS n_tup_del,
T.n_tup_hot_upd AS n_tup_hot_upd,
T.n_live_tup AS n_live_tup,
T.n_dead_tup AS n_dead_tup,
T.last_vacuum AS last_vacuum,
T.last_autovacuum AS last_autovacuum,
T.last_analyze AS last_analyze,
T.last_autoanalyze AS last_autoanalyze,
T.vacuum_count AS vacuum_count,
T.autovacuum_count AS autovacuum_count,
T.analyze_count AS analyze_count,
T.autoanalyze_count AS autoanalyze_count
FROM dbe_perf.stat_all_tables T
LEFT JOIN pg_class C ON T.relid = C.reltoastrelid
LEFT JOIN pg_namespace N ON C.relnamespace = N.oid';
FOR row_data IN EXECUTE(query_str) LOOP
schemaname := row_data.schemaname;
IF row_data.toastrelname IS NULL THEN
relname := row_data.relname;
ELSE
relname := NULL;
END IF;
toastrelschemaname := row_data.toastrelschemaname;
toastrelname := row_data.toastrelname;
seq_scan := row_data.seq_scan;
seq_tup_read := row_data.seq_tup_read;
idx_scan := row_data.idx_scan;
idx_tup_fetch := row_data.idx_tup_fetch;
n_tup_ins := row_data.n_tup_ins;
n_tup_upd := row_data.n_tup_upd;
n_tup_del := row_data.n_tup_del;
n_tup_hot_upd := row_data.n_tup_hot_upd;
n_live_tup := row_data.n_live_tup;
n_dead_tup := row_data.n_dead_tup;
last_vacuum := row_data.last_vacuum;
last_autovacuum := row_data.last_autovacuum;
last_analyze := row_data.last_analyze;
last_autoanalyze := row_data.last_autoanalyze;
vacuum_count := row_data.vacuum_count;
autovacuum_count := row_data.autovacuum_count;
analyze_count := row_data.analyze_count;
autoanalyze_count := row_data.autoanalyze_count;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.summary_stat_all_tables AS
SELECT Ti.schemaname, COALESCE(Ti.relname, Tn.toastname, NULL) as relname,
pg_catalog.SUM(Ti.seq_scan) seq_scan, pg_catalog.SUM(Ti.seq_tup_read) seq_tup_read,
pg_catalog.SUM(Ti.idx_scan) idx_scan, pg_catalog.SUM(Ti.idx_tup_fetch) idx_tup_fetch,
pg_catalog.SUM(Ti.n_tup_ins) n_tup_ins, pg_catalog.SUM(Ti.n_tup_upd) n_tup_upd,
pg_catalog.SUM(Ti.n_tup_del) n_tup_del, pg_catalog.SUM(Ti.n_tup_hot_upd) n_tup_hot_upd,
pg_catalog.SUM(Ti.n_live_tup) n_live_tup, pg_catalog.SUM(Ti.n_dead_tup) n_dead_tup,
pg_catalog.MAX(Ti.last_vacuum) last_vacuum, pg_catalog.MAX(Ti.last_autovacuum) last_autovacuum,
pg_catalog.MAX(Ti.last_analyze) last_analyze, pg_catalog.MAX(Ti.last_autoanalyze) last_autoanalyze,
pg_catalog.SUM(Ti.vacuum_count) vacuum_count, pg_catalog.SUM(Ti.autovacuum_count) autovacuum_count,
pg_catalog.SUM(Ti.analyze_count) analyze_count, pg_catalog.SUM(Ti.autoanalyze_count) autoanalyze_count
FROM (SELECT * FROM dbe_perf.get_summary_stat_all_tables()) AS Ti
LEFT JOIN dbe_perf.get_local_toast_relation() Tn
ON Tn.shemaname = Ti.toastrelschemaname AND Tn.relname = Ti.toastrelname
GROUP BY (1, 2);
CREATE VIEW dbe_perf.stat_all_indexes AS
SELECT
C.oid AS relid,
I.oid AS indexrelid,
N.nspname AS schemaname,
C.relname AS relname,
I.relname AS indexrelname,
pg_catalog.pg_stat_get_numscans(I.oid) AS idx_scan,
pg_catalog.pg_stat_get_tuples_returned(I.oid) AS idx_tup_read,
pg_catalog.pg_stat_get_tuples_fetched(I.oid) AS idx_tup_fetch
FROM pg_class C JOIN
pg_index X ON C.oid = X.indrelid JOIN
pg_class I ON I.oid = X.indexrelid
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
WHERE C.relkind IN ('r', 't');
CREATE OR REPLACE FUNCTION dbe_perf.get_global_stat_all_indexes
(OUT node_name name, OUT relid oid, OUT indexrelid oid, OUT schemaname name, OUT relname name,
OUT indexrelname name, OUT idx_scan bigint, OUT idx_tup_read bigint, OUT idx_tup_fetch bigint)
RETURNS setof record
AS $$
DECLARE
row_data record;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.stat_all_indexes';
FOR row_data IN EXECUTE(query_str) LOOP
node_name := row_name.node_name;
relid := row_data.relid;
indexrelid := row_data.indexrelid;
schemaname := row_data.schemaname;
relname := row_data.relname;
indexrelname := row_data.indexrelname;
idx_scan := row_data.idx_scan;
idx_tup_read := row_data.idx_tup_read;
idx_tup_fetch := row_data.idx_tup_fetch;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_stat_all_indexes AS
SELECT * FROM dbe_perf.get_global_stat_all_indexes();
CREATE OR REPLACE FUNCTION dbe_perf.get_summary_stat_all_indexes
(OUT schemaname name, OUT relname name, OUT indexrelname name,
OUT toastrelschemaname name, OUT toastrelname name,
OUT idx_scan bigint, OUT idx_tup_read bigint, OUT idx_tup_fetch bigint)
RETURNS setof record
AS $$
DECLARE
row_data record;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := '
SELECT
T.relname AS relname,
T.schemaname AS schemaname,
C.relname AS toastrelname,
N.nspname AS toastrelschemaname,
T.indexrelname AS indexrelname,
T.idx_scan AS idx_scan,
T.idx_tup_read AS idx_tup_read,
T.idx_tup_fetch AS idx_tup_fetch
FROM dbe_perf.stat_all_indexes T
LEFT JOIN pg_class C ON T.relid = C.reltoastrelid
LEFT JOIN pg_namespace N ON C.relnamespace = N.oid';
FOR row_data IN EXECUTE(query_str) LOOP
schemaname := row_data.schemaname;
IF row_data.toastrelname IS NULL THEN
relname := row_data.relname;
indexrelname := row_data.indexrelname;
ELSE
relname := NULL;
indexrelname := NULL;
END IF;
toastrelschemaname := row_data.toastrelschemaname;
toastrelname := row_data.toastrelname;
idx_scan := row_data.idx_scan;
idx_tup_read := row_data.idx_tup_read;
idx_tup_fetch := row_data.idx_tup_fetch;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.summary_stat_all_indexes AS
SELECT Ti.schemaname, COALESCE(Ti.relname, Tn.toastname) AS relname,
COALESCE(Ti.indexrelname, Tn.toastindexname) AS indexrelname,
pg_catalog.SUM(Ti.idx_scan) idx_scan, pg_catalog.SUM(Ti.idx_tup_read) idx_tup_read, pg_catalog.SUM(Ti.idx_tup_fetch) idx_tup_fetch
FROM dbe_perf.get_summary_stat_all_indexes() AS Ti
LEFT JOIN dbe_perf.get_local_toastname_and_toastindexname() AS Tn
ON (Tn.shemaname = Ti.toastrelschemaname AND Tn.relname = Ti.toastrelname)
GROUP BY (1, 2, 3);
CREATE VIEW dbe_perf.stat_sys_tables AS
SELECT * FROM dbe_perf.stat_all_tables
WHERE schemaname IN ('pg_catalog', 'information_schema') OR
schemaname ~ '^pg_toast';
CREATE OR REPLACE FUNCTION dbe_perf.get_global_stat_sys_tables
(OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT seq_scan bigint,
OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint,
OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint,
OUT n_dead_tup bigint, OUT last_vacuum timestamp with time zone, OUT last_autovacuum timestamp with time zone,
OUT last_analyze timestamp with time zone, OUT last_autoanalyze timestamp with time zone, OUT vacuum_count bigint,
OUT autovacuum_count bigint, OUT analyze_count bigint, OUT autoanalyze_count bigint)
RETURNS setof record
AS $$
DECLARE
row_data record;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.stat_sys_tables';
FOR row_data IN EXECUTE(query_str) LOOP
node_name := row_name.node_name;
relid := row_data.relid;
schemaname := row_data.schemaname;
relname := row_data.relname;
seq_scan := row_data.seq_scan;
seq_tup_read := row_data.seq_tup_read;
idx_scan := row_data.idx_scan;
idx_tup_fetch := row_data.idx_tup_fetch;
n_tup_ins := row_data.n_tup_ins;
n_tup_upd := row_data.n_tup_upd;
n_tup_del := row_data.n_tup_del;
n_tup_hot_upd := row_data.n_tup_hot_upd;
n_live_tup := row_data.n_live_tup;
n_dead_tup := row_data.n_dead_tup;
last_vacuum := row_data.last_vacuum;
last_autovacuum := row_data.last_autovacuum;
last_analyze := row_data.last_analyze;
last_autoanalyze := row_data.last_autoanalyze;
vacuum_count := row_data.vacuum_count;
autovacuum_count := row_data.autovacuum_count;
analyze_count := row_data.analyze_count;
autoanalyze_count := row_data.autoanalyze_count;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_stat_sys_tables AS
SELECT * FROM dbe_perf.get_global_stat_sys_tables();
CREATE OR REPLACE FUNCTION dbe_perf.get_summary_stat_sys_tables
(OUT schemaname name, OUT relname name,
OUT toastrelschemaname name, OUT toastrelname name,
OUT seq_scan bigint, OUT seq_tup_read bigint,
OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint,
OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint,
OUT n_dead_tup bigint, OUT last_vacuum timestamp with time zone, OUT last_autovacuum timestamp with time zone,
OUT last_analyze timestamp with time zone, OUT last_autoanalyze timestamp with time zone, OUT vacuum_count bigint,
OUT autovacuum_count bigint, OUT analyze_count bigint, OUT autoanalyze_count bigint)
RETURNS setof record
AS $$
DECLARE
row_data record;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := '
SELECT
T.schemaname AS schemaname,
T.relname AS relname,
C.relname AS toastrelname,
N.nspname AS toastrelschemaname,
T.seq_scan AS seq_scan,
T.seq_tup_read AS seq_tup_read,
T.idx_scan AS idx_scan,
T.idx_tup_fetch AS idx_tup_fetch,
T.n_tup_ins AS n_tup_ins,
T.n_tup_upd AS n_tup_upd,
T.n_tup_del AS n_tup_del,
T.n_tup_hot_upd AS n_tup_hot_upd,
T.n_live_tup AS n_live_tup,
T.n_dead_tup AS n_dead_tup,
T.last_vacuum AS last_vacuum,
T.last_autovacuum AS last_autovacuum,
T.last_analyze AS last_analyze,
T.last_autoanalyze AS last_autoanalyze,
T.vacuum_count AS vacuum_count,
T.autovacuum_count AS autovacuum_count,
T.analyze_count AS analyze_count,
T.autoanalyze_count AS autoanalyze_count
FROM dbe_perf.stat_sys_tables T
LEFT JOIN pg_class C ON T.relid = C.reltoastrelid
LEFT JOIN pg_namespace N ON C.relnamespace = N.oid';
FOR row_data IN EXECUTE(query_str) LOOP
schemaname := row_data.schemaname;
IF row_data.toastrelname IS NULL THEN
relname := row_data.relname;
ELSE
relname := NULL;
END IF;
toastrelschemaname := row_data.toastrelschemaname;
toastrelname := row_data.toastrelname;
seq_scan := row_data.seq_scan;
seq_tup_read := row_data.seq_tup_read;
idx_scan := row_data.idx_scan;
idx_tup_fetch := row_data.idx_tup_fetch;
n_tup_ins := row_data.n_tup_ins;
n_tup_upd := row_data.n_tup_upd;
n_tup_del := row_data.n_tup_del;
n_tup_hot_upd := row_data.n_tup_hot_upd;
n_live_tup := row_data.n_live_tup;
n_dead_tup := row_data.n_dead_tup;
last_vacuum := row_data.last_vacuum;
last_autovacuum := row_data.last_autovacuum;
last_analyze := row_data.last_analyze;
last_autoanalyze := row_data.last_autoanalyze;
vacuum_count := row_data.vacuum_count;
autovacuum_count := row_data.autovacuum_count;
analyze_count := row_data.analyze_count;
autoanalyze_count := row_data.autoanalyze_count;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.summary_stat_sys_tables AS
SELECT Ti.schemaname, COALESCE(Ti.relname, Tn.toastname, NULL) AS relname,
pg_catalog.SUM(Ti.seq_scan) seq_scan, pg_catalog.SUM(Ti.seq_tup_read) seq_tup_read,
pg_catalog.SUM(Ti.idx_scan) idx_scan, pg_catalog.SUM(Ti.idx_tup_fetch) idx_tup_fetch,
pg_catalog.SUM(Ti.n_tup_ins) n_tup_ins, pg_catalog.SUM(Ti.n_tup_upd) n_tup_upd,
pg_catalog.SUM(Ti.n_tup_del) n_tup_del, pg_catalog.SUM(Ti.n_tup_hot_upd) n_tup_hot_upd,
pg_catalog.SUM(Ti.n_live_tup) n_live_tup, pg_catalog.SUM(Ti.n_dead_tup) n_dead_tup,
pg_catalog.MAX(Ti.last_vacuum) last_vacuum, pg_catalog.MAX(Ti.last_autovacuum) last_autovacuum,
pg_catalog.MAX(Ti.last_analyze) last_analyze, pg_catalog.MAX(Ti.last_autoanalyze) last_autoanalyze,
pg_catalog.SUM(Ti.vacuum_count) vacuum_count, pg_catalog.SUM(Ti.autovacuum_count) autovacuum_count,
pg_catalog.SUM(Ti.analyze_count) analyze_count, pg_catalog.SUM(Ti.autoanalyze_count) autoanalyze_count
FROM dbe_perf.get_summary_stat_sys_tables() as Ti LEFT JOIN dbe_perf.get_local_toast_relation() as Tn
ON (Tn.shemaname = Ti.toastrelschemaname AND Tn.relname = Ti.toastrelname)
GROUP BY (1, 2);
CREATE VIEW dbe_perf.stat_sys_indexes AS
SELECT * FROM dbe_perf.stat_all_indexes
WHERE schemaname IN ('pg_catalog', 'information_schema') OR
schemaname ~ '^pg_toast';
CREATE OR REPLACE FUNCTION dbe_perf.get_global_stat_sys_indexes
(OUT node_name name, OUT relid oid, OUT indexrelid oid, OUT schemaname name, OUT relname name,
OUT indexrelname name, OUT idx_scan bigint, OUT idx_tup_read bigint, OUT idx_tup_fetch bigint)
RETURNS setof record
AS $$
DECLARE
row_data record;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.stat_sys_indexes';
FOR row_data IN EXECUTE(query_str) LOOP
node_name := row_name.node_name;
relid := row_data.relid;
indexrelid := row_data.indexrelid;
schemaname := row_data.schemaname;
relname := row_data.relname;
indexrelname := row_data.indexrelname;
idx_scan := row_data.idx_scan;
idx_tup_read := row_data.idx_tup_read;
idx_tup_fetch := row_data.idx_tup_fetch;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_stat_sys_indexes AS
SELECT * FROM dbe_perf.get_global_stat_sys_indexes();
CREATE OR REPLACE FUNCTION dbe_perf.get_summary_stat_sys_indexes
(OUT schemaname name, OUT relname name, OUT indexrelname name,
OUT toastrelschemaname name, OUT toastrelname name,
OUT idx_scan bigint, OUT idx_tup_read bigint, OUT idx_tup_fetch bigint)
RETURNS setof record
AS $$
DECLARE
row_data record;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := '
SELECT
T.relname AS relname,
T.schemaname AS schemaname,
C.relname AS toastrelname,
N.nspname AS toastrelschemaname,
T.indexrelname AS indexrelname,
T.idx_scan AS idx_scan,
T.idx_tup_read AS idx_tup_read,
T.idx_tup_fetch AS idx_tup_fetch
FROM dbe_perf.stat_sys_indexes T
LEFT JOIN pg_class C ON T.relid = C.reltoastrelid
LEFT JOIN pg_namespace N ON C.relnamespace = N.oid';
FOR row_data IN EXECUTE(query_str) LOOP
schemaname := row_data.schemaname;
IF row_data.toastrelname IS NULL THEN
relname := row_data.relname;
indexrelname := row_data.indexrelname;
ELSE
relname := NULL;
indexrelname := NULL;
END IF;
toastrelschemaname := row_data.toastrelschemaname;
toastrelname := row_data.toastrelname;
idx_scan := row_data.idx_scan;
idx_tup_read := row_data.idx_tup_read;
idx_tup_fetch := row_data.idx_tup_fetch;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.summary_stat_sys_indexes AS
SELECT Ti.schemaname AS schemaname, COALESCE(Ti.relname, Tn.toastname) AS relname,
COALESCE(Ti.indexrelname, Tn.toastindexname) AS indexrelname,
pg_catalog.SUM(Ti.idx_scan) idx_scan, pg_catalog.SUM(Ti.idx_tup_read) idx_tup_read, pg_catalog.SUM(Ti.idx_tup_fetch) idx_tup_fetch
FROM dbe_perf.get_summary_stat_sys_indexes() AS Ti
LEFT JOIN dbe_perf.get_local_toastname_and_toastindexname() AS Tn
ON (Tn.shemaname = Ti.toastrelschemaname AND Tn.relname = Ti.toastrelname)
GROUP BY (1, 2, 3);
CREATE VIEW dbe_perf.stat_user_tables AS
SELECT * FROM dbe_perf.stat_all_tables
WHERE schemaname NOT IN ('pg_catalog', 'information_schema') AND
schemaname !~ '^pg_toast';
CREATE OR REPLACE FUNCTION dbe_perf.get_global_stat_user_tables
(OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT seq_scan bigint,
OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint,
OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint,
OUT n_dead_tup bigint, OUT last_vacuum timestamp with time zone, OUT last_autovacuum timestamp with time zone,
OUT last_analyze timestamp with time zone, OUT last_autoanalyze timestamp with time zone, OUT vacuum_count bigint,
OUT autovacuum_count bigint, OUT analyze_count bigint, OUT autoanalyze_count bigint)
RETURNS setof record
AS $$
DECLARE
row_data record;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.stat_user_tables';
FOR row_data IN EXECUTE(query_str) LOOP
node_name := row_name.node_name;
relid := row_data.relid;
schemaname := row_data.schemaname;
relname := row_data.relname;
seq_scan := row_data.seq_scan;
seq_tup_read := row_data.seq_tup_read;
idx_scan := row_data.idx_scan;
idx_tup_fetch := row_data.idx_tup_fetch;
n_tup_ins := row_data.n_tup_ins;
n_tup_upd := row_data.n_tup_upd;
n_tup_del := row_data.n_tup_del;
n_tup_hot_upd := row_data.n_tup_hot_upd;
n_live_tup := row_data.n_live_tup;
n_dead_tup := row_data.n_dead_tup;
last_vacuum := row_data.last_vacuum;
last_autovacuum := row_data.last_autovacuum;
last_analyze := row_data.last_analyze;
last_autoanalyze := row_data.last_autoanalyze;
vacuum_count := row_data.vacuum_count;
autovacuum_count := row_data.autovacuum_count;
analyze_count := row_data.analyze_count;
autoanalyze_count := row_data.autoanalyze_count;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_stat_user_tables AS
SELECT * FROM dbe_perf.get_global_stat_user_tables();
CREATE OR REPLACE FUNCTION dbe_perf.get_summary_stat_user_tables
(OUT schemaname name, OUT relname name,
OUT toastrelschemaname name, OUT toastrelname name,
OUT seq_scan bigint, OUT seq_tup_read bigint,
OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint,
OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint, OUT n_live_tup bigint,
OUT n_dead_tup bigint, OUT last_vacuum timestamp with time zone, OUT last_autovacuum timestamp with time zone,
OUT last_analyze timestamp with time zone, OUT last_autoanalyze timestamp with time zone, OUT vacuum_count bigint,
OUT autovacuum_count bigint, OUT analyze_count bigint, OUT autoanalyze_count bigint)
RETURNS setof record
AS $$
DECLARE
row_data record;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := '
SELECT
T.schemaname AS schemaname,
T.relname AS relname,
C.relname AS toastrelname,
N.nspname AS toastrelschemaname,
T.seq_scan AS seq_scan,
T.seq_tup_read AS seq_tup_read,
T.idx_scan AS idx_scan,
T.idx_tup_fetch AS idx_tup_fetch,
T.n_tup_ins AS n_tup_ins,
T.n_tup_upd AS n_tup_upd,
T.n_tup_del AS n_tup_del,
T.n_tup_hot_upd AS n_tup_hot_upd,
T.n_live_tup AS n_live_tup,
T.n_dead_tup AS n_dead_tup,
T.last_vacuum AS last_vacuum,
T.last_autovacuum AS last_autovacuum,
T.last_analyze AS last_analyze,
T.last_autoanalyze AS last_autoanalyze,
T.vacuum_count AS vacuum_count,
T.autovacuum_count AS autovacuum_count,
T.analyze_count AS analyze_count,
T.autoanalyze_count AS autoanalyze_count
FROM dbe_perf.stat_user_tables T
LEFT JOIN pg_class C ON T.relid = C.reltoastrelid
LEFT JOIN pg_namespace N ON C.relnamespace = N.oid';
FOR row_data IN EXECUTE(query_str) LOOP
schemaname := row_data.schemaname;
IF row_data.toastrelname IS NULL THEN
relname := row_data.relname;
ELSE
relname := NULL;
END IF;
toastrelschemaname := row_data.toastrelschemaname;
toastrelname := row_data.toastrelname;
seq_scan := row_data.seq_scan;
seq_tup_read := row_data.seq_tup_read;
idx_scan := row_data.idx_scan;
idx_tup_fetch := row_data.idx_tup_fetch;
n_tup_ins := row_data.n_tup_ins;
n_tup_upd := row_data.n_tup_upd;
n_tup_del := row_data.n_tup_del;
n_tup_hot_upd := row_data.n_tup_hot_upd;
n_live_tup := row_data.n_live_tup;
n_dead_tup := row_data.n_dead_tup;
last_vacuum := row_data.last_vacuum;
last_autovacuum := row_data.last_autovacuum;
last_analyze := row_data.last_analyze;
last_autoanalyze := row_data.last_autoanalyze;
vacuum_count := row_data.vacuum_count;
autovacuum_count := row_data.autovacuum_count;
analyze_count := row_data.analyze_count;
autoanalyze_count := row_data.autoanalyze_count;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.summary_stat_user_tables AS
SELECT Ti.schemaname AS schemaname, COALESCE(Ti.relname, Tn.toastname, NULL) AS relname,
pg_catalog.SUM(Ti.seq_scan) seq_scan, pg_catalog.SUM(Ti.seq_tup_read) seq_tup_read,
pg_catalog.SUM(Ti.idx_scan) idx_scan, pg_catalog.SUM(Ti.idx_tup_fetch) idx_tup_fetch,
pg_catalog.SUM(Ti.n_tup_ins) n_tup_ins, pg_catalog.SUM(Ti.n_tup_upd) n_tup_upd,
pg_catalog.SUM(Ti.n_tup_del) n_tup_del, pg_catalog.SUM(Ti.n_tup_hot_upd) n_tup_hot_upd,
pg_catalog.SUM(Ti.n_live_tup) n_live_tup, pg_catalog.SUM(Ti.n_dead_tup) n_dead_tup,
pg_catalog.MAX(Ti.last_vacuum) last_vacuum, pg_catalog.MAX(Ti.last_autovacuum) last_autovacuum,
pg_catalog.MAX(Ti.last_analyze) last_analyze, pg_catalog.MAX(Ti.last_autoanalyze) last_autoanalyze,
pg_catalog.SUM(Ti.vacuum_count) vacuum_count, pg_catalog.SUM(Ti.autovacuum_count) autovacuum_count,
pg_catalog.SUM(Ti.analyze_count) analyze_count, pg_catalog.SUM(Ti.autoanalyze_count) autoanalyze_count
FROM dbe_perf.get_summary_stat_user_tables() AS Ti LEFT JOIN dbe_perf.get_local_toast_relation() AS Tn
ON (Tn.shemaname = Ti.toastrelschemaname AND Tn.relname = Ti.toastrelname)
GROUP BY (1, 2);
CREATE VIEW dbe_perf.stat_user_indexes AS
SELECT * FROM dbe_perf.stat_all_indexes
WHERE schemaname NOT IN ('pg_catalog', 'information_schema') AND
schemaname !~ '^pg_toast';
CREATE OR REPLACE FUNCTION dbe_perf.get_global_stat_user_indexes
(OUT node_name name, OUT relid oid, OUT indexrelid oid, OUT schemaname name, OUT relname name,
OUT indexrelname name, OUT idx_scan bigint, OUT idx_tup_read bigint, OUT idx_tup_fetch bigint)
RETURNS setof record
AS $$
DECLARE
row_data record;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.stat_user_indexes';
FOR row_data IN EXECUTE(query_str) LOOP
node_name := row_name.node_name;
relid := row_data.relid;
indexrelid := row_data.indexrelid;
schemaname := row_data.schemaname;
relname := row_data.relname;
indexrelname := row_data.indexrelname;
idx_scan := row_data.idx_scan;
idx_tup_read := row_data.idx_tup_read;
idx_tup_fetch := row_data.idx_tup_fetch;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_stat_user_indexes AS
SELECT * FROM dbe_perf.get_global_stat_user_indexes();
CREATE OR REPLACE FUNCTION dbe_perf.get_summary_stat_user_indexes
(OUT schemaname name, OUT relname name, OUT indexrelname name,
OUT toastrelschemaname name, OUT toastrelname name,
OUT idx_scan bigint, OUT idx_tup_read bigint, OUT idx_tup_fetch bigint)
RETURNS setof record
AS $$
DECLARE
row_data record;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := '
SELECT
T.relname AS relname,
T.schemaname AS schemaname,
C.relname AS toastrelname,
N.nspname AS toastrelschemaname,
T.indexrelname AS indexrelname,
T.idx_scan AS idx_scan,
T.idx_tup_read AS idx_tup_read,
T.idx_tup_fetch AS idx_tup_fetch
FROM dbe_perf.stat_user_indexes T
LEFT JOIN pg_class C ON T.relid = C.reltoastrelid
LEFT JOIN pg_namespace N ON C.relnamespace = N.oid';
FOR row_data IN EXECUTE(query_str) LOOP
schemaname := row_data.schemaname;
IF row_data.toastrelname IS NULL THEN
relname := row_data.relname;
indexrelname := row_data.indexrelname;
ELSE
relname := NULL;
indexrelname := NULL;
END IF;
toastrelschemaname := row_data.toastrelschemaname;
toastrelname := row_data.toastrelname;
idx_scan := row_data.idx_scan;
idx_tup_read := row_data.idx_tup_read;
idx_tup_fetch := row_data.idx_tup_fetch;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.summary_stat_user_indexes AS
SELECT Ti.schemaname, COALESCE(Ti.relname, Tn.toastname) AS relname,
COALESCE(Ti.indexrelname, Tn.toastindexname) AS indexrelname,
pg_catalog.SUM(Ti.idx_scan) idx_scan, pg_catalog.SUM(Ti.idx_tup_read) idx_tup_read, pg_catalog.SUM(Ti.idx_tup_fetch) idx_tup_fetch
FROM dbe_perf.get_summary_stat_user_indexes() as Ti
LEFT JOIN dbe_perf.get_local_toastname_and_toastindexname() AS Tn
ON (Tn.shemaname = Ti.toastrelschemaname AND Tn.relname = Ti.toastrelname)
GROUP BY (1, 2, 3);
CREATE VIEW dbe_perf.stat_database AS
SELECT
D.oid AS datid,
D.datname AS datname,
pg_catalog.pg_stat_get_db_numbackends(D.oid) AS numbackends,
pg_catalog.pg_stat_get_db_xact_commit(D.oid) AS xact_commit,
pg_catalog.pg_stat_get_db_xact_rollback(D.oid) AS xact_rollback,
pg_catalog.pg_stat_get_db_blocks_fetched(D.oid) -
pg_catalog.pg_stat_get_db_blocks_hit(D.oid) AS blks_read,
pg_catalog.pg_stat_get_db_blocks_hit(D.oid) AS blks_hit,
pg_catalog.pg_stat_get_db_tuples_returned(D.oid) AS tup_returned,
pg_catalog.pg_stat_get_db_tuples_fetched(D.oid) AS tup_fetched,
pg_catalog.pg_stat_get_db_tuples_inserted(D.oid) AS tup_inserted,
pg_catalog.pg_stat_get_db_tuples_updated(D.oid) AS tup_updated,
pg_catalog.pg_stat_get_db_tuples_deleted(D.oid) AS tup_deleted,
pg_catalog.pg_stat_get_db_conflict_all(D.oid) AS conflicts,
pg_catalog.pg_stat_get_db_temp_files(D.oid) AS temp_files,
pg_catalog.pg_stat_get_db_temp_bytes(D.oid) AS temp_bytes,
pg_catalog.pg_stat_get_db_deadlocks(D.oid) AS deadlocks,
pg_catalog.pg_stat_get_db_blk_read_time(D.oid) AS blk_read_time,
pg_catalog.pg_stat_get_db_blk_write_time(D.oid) AS blk_write_time,
pg_catalog.pg_stat_get_db_stat_reset_time(D.oid) AS stats_reset
FROM pg_database D;
CREATE OR REPLACE FUNCTION dbe_perf.get_global_stat_database
(OUT node_name name, OUT datid oid, OUT datname name, OUT numbackends integer, OUT xact_commit bigint,
OUT xact_rollback bigint, OUT blks_read bigint, OUT blks_hit bigint, OUT tup_returned bigint, OUT tup_fetched bigint,
OUT tup_inserted bigint, OUT tup_updated bigint, OUT tup_deleted bigint, OUT conflicts bigint, OUT temp_files bigint,
OUT temp_bytes bigint, OUT deadlocks bigint, OUT blk_read_time double precision, OUT blk_write_time double precision,
OUT stats_reset timestamp with time zone)
RETURNS setof record
AS $$
DECLARE
row_data dbe_perf.stat_database%rowtype;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.stat_database';
FOR row_data IN EXECUTE(query_str) LOOP
node_name := row_name.node_name;
datid := row_data.datid;
datname := row_data.datname;
numbackends := row_data.numbackends;
xact_commit := row_data.xact_commit;
xact_rollback := row_data.xact_rollback;
blks_read := row_data.blks_read;
blks_hit := row_data.blks_hit;
tup_returned := row_data.tup_returned;
tup_fetched := row_data.tup_fetched;
tup_inserted := row_data.tup_inserted;
tup_updated := row_data.tup_updated;
tup_deleted := row_data.tup_deleted;
conflicts := row_data.conflicts;
temp_files := row_data.temp_files;
temp_bytes := row_data.temp_bytes;
deadlocks := row_data.deadlocks;
blk_read_time := row_data.blk_read_time;
blk_write_time := row_data.blk_write_time;
stats_reset := row_data.stats_reset;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_stat_database AS
SELECT * FROM dbe_perf.get_global_stat_database();
CREATE VIEW dbe_perf.summary_stat_database AS
SELECT ALL_NODES.datname,
ALL_NODES.numbackends, ALL_NODES.xact_commit, ALL_NODES.xact_rollback,
ALL_NODES.blks_read, ALL_NODES.blks_hit, ALL_NODES.tup_returned, ALL_NODES.tup_fetched,
SUMMARY_ITEM.tup_inserted, SUMMARY_ITEM.tup_updated, SUMMARY_ITEM.tup_deleted,
SUMMARY_ITEM.conflicts, ALL_NODES.temp_files, ALL_NODES.temp_bytes, SUMMARY_ITEM.deadlocks,
ALL_NODES.blk_read_time, ALL_NODES.blk_write_time, ALL_NODES.stats_reset
FROM
dbe_perf.stat_database AS SUMMARY_ITEM,
(SELECT datname,
pg_catalog.SUM(numbackends) numbackends, pg_catalog.SUM(xact_commit) xact_commit, pg_catalog.SUM(xact_rollback) xact_rollback,
pg_catalog.SUM(blks_read) blks_read, pg_catalog.SUM(blks_hit) blks_hit, pg_catalog.SUM(tup_returned) tup_returned,
pg_catalog.SUM(tup_fetched) tup_fetched, pg_catalog.SUM(temp_files) temp_files,
pg_catalog.SUM(temp_bytes) temp_bytes, pg_catalog.SUM(blk_read_time) blk_read_time,
pg_catalog.SUM(blk_write_time) blk_write_time, pg_catalog.MAX(stats_reset) stats_reset
FROM dbe_perf.get_global_stat_database() GROUP BY (datname)) AS ALL_NODES
WHERE ALL_NODES.datname = SUMMARY_ITEM.datname;
CREATE VIEW dbe_perf.stat_database_conflicts AS
SELECT
D.oid AS datid,
D.datname AS datname,
pg_catalog.pg_stat_get_db_conflict_tablespace(D.oid) AS confl_tablespace,
pg_catalog.pg_stat_get_db_conflict_lock(D.oid) AS confl_lock,
pg_catalog.pg_stat_get_db_conflict_snapshot(D.oid) AS confl_snapshot,
pg_catalog.pg_stat_get_db_conflict_bufferpin(D.oid) AS confl_bufferpin,
pg_catalog.pg_stat_get_db_conflict_startup_deadlock(D.oid) AS confl_deadlock
FROM pg_database D;
CREATE OR REPLACE FUNCTION dbe_perf.get_global_stat_database_conflicts
(OUT node_name name, OUT datid oid, OUT datname name, OUT confl_tablespace bigint,
OUT confl_lock bigint, OUT confl_snapshot bigint, OUT confl_bufferpin bigint, OUT confl_deadlock bigint)
RETURNS setof record
AS $$
DECLARE
row_data dbe_perf.stat_database_conflicts%rowtype;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.stat_database_conflicts';
FOR row_data IN EXECUTE(query_str) LOOP
node_name := row_name.node_name;
datid := row_data.datid;
datname := row_data.datname;
confl_tablespace := row_data.confl_tablespace;
confl_lock := row_data.confl_lock;
confl_snapshot := row_data.confl_snapshot;
confl_bufferpin := row_data.confl_bufferpin;
confl_deadlock := row_data.confl_deadlock;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_stat_database_conflicts AS
SELECT * FROM dbe_perf.get_global_stat_database_conflicts();
CREATE VIEW dbe_perf.summary_stat_database_conflicts AS
SELECT
D.datname AS datname,
pg_catalog.pg_stat_get_db_conflict_tablespace(D.oid) AS confl_tablespace,
pg_catalog.pg_stat_get_db_conflict_lock(D.oid) AS confl_lock,
pg_catalog.pg_stat_get_db_conflict_snapshot(D.oid) AS confl_snapshot,
pg_catalog.pg_stat_get_db_conflict_bufferpin(D.oid) AS confl_bufferpin,
pg_catalog.pg_stat_get_db_conflict_startup_deadlock(D.oid) AS confl_deadlock
FROM pg_database D;
CREATE VIEW dbe_perf.stat_xact_all_tables AS
SELECT
C.oid AS relid,
N.nspname AS schemaname,
C.relname AS relname,
pg_catalog.pg_stat_get_xact_numscans(C.oid) AS seq_scan,
pg_catalog.pg_stat_get_xact_tuples_returned(C.oid) AS seq_tup_read,
pg_catalog.sum(pg_catalog.pg_stat_get_xact_numscans(I.indexrelid))::bigint AS idx_scan,
pg_catalog.sum(pg_catalog.pg_stat_get_xact_tuples_fetched(I.indexrelid))::bigint +
pg_catalog.pg_stat_get_xact_tuples_fetched(C.oid) AS idx_tup_fetch,
pg_catalog.pg_stat_get_xact_tuples_inserted(C.oid) AS n_tup_ins,
pg_catalog.pg_stat_get_xact_tuples_updated(C.oid) AS n_tup_upd,
pg_catalog.pg_stat_get_xact_tuples_deleted(C.oid) AS n_tup_del,
pg_catalog.pg_stat_get_xact_tuples_hot_updated(C.oid) AS n_tup_hot_upd
FROM pg_class C LEFT JOIN
pg_index I ON C.oid = I.indrelid
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
WHERE C.relkind IN ('r', 't')
GROUP BY C.oid, N.nspname, C.relname;
CREATE OR REPLACE FUNCTION dbe_perf.get_global_stat_xact_all_tables
(OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT seq_scan bigint,
OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint,
OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint)
RETURNS setof record
AS $$
DECLARE
row_data dbe_perf.stat_xact_all_tables%rowtype;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.stat_xact_all_tables';
FOR row_data IN EXECUTE(query_str) LOOP
node_name := row_name.node_name;
relid := row_data.relid;
schemaname := row_data.schemaname;
relname := row_data.relname;
seq_scan := row_data.seq_scan;
seq_tup_read := row_data.seq_tup_read;
idx_scan := row_data.idx_scan;
idx_tup_fetch := row_data.idx_tup_fetch;
n_tup_ins := row_data.n_tup_ins;
n_tup_upd := row_data.n_tup_upd;
n_tup_del := row_data.n_tup_del;
n_tup_hot_upd := row_data.n_tup_hot_upd;
return next;
END LOOP;
END LOOP;
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.stat_xact_all_tables where schemaname = ''pg_catalog'' or schemaname =''pg_toast'' ';
FOR row_data IN EXECUTE(query_str) LOOP
node_name := row_name.node_name;
relid := row_data.relid;
schemaname := row_data.schemaname;
relname := row_data.relname;
seq_scan := row_data.seq_scan;
seq_tup_read := row_data.seq_tup_read;
idx_scan := row_data.idx_scan;
idx_tup_fetch := row_data.idx_tup_fetch;
n_tup_ins := row_data.n_tup_ins;
n_tup_upd := row_data.n_tup_upd;
n_tup_del := row_data.n_tup_del;
n_tup_hot_upd := row_data.n_tup_hot_upd;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_stat_xact_all_tables AS
SELECT * FROM dbe_perf.get_global_stat_xact_all_tables();
CREATE OR REPLACE FUNCTION dbe_perf.get_summary_stat_xact_all_tables
(OUT schemaname name, OUT relname name,
OUT toastrelschemaname name, OUT toastrelname name,
OUT seq_scan bigint, OUT seq_tup_read bigint,
OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint,
OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint)
RETURNS setof record
AS $$
DECLARE
row_data record;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := '
SELECT
T.schemaname AS schemaname,
T.relname AS relname,
N.nspname AS toastrelschemaname,
C.relname AS toastrelname,
T.seq_scan AS seq_scan,
T.seq_tup_read AS seq_tup_read,
T.idx_scan AS idx_scan,
T.idx_tup_fetch AS idx_tup_fetch,
T.n_tup_ins AS n_tup_ins,
T.n_tup_upd AS n_tup_upd,
T.n_tup_del AS n_tup_del,
T.n_tup_hot_upd AS n_tup_hot_upd
FROM dbe_perf.stat_xact_all_tables T
LEFT JOIN pg_class C ON T.relid = C.reltoastrelid
LEFT JOIN pg_namespace N ON C.relnamespace = N.oid';
FOR row_data IN EXECUTE(query_str) LOOP
schemaname := row_data.schemaname;
IF row_data.toastrelname IS NULL THEN
relname := row_data.relname;
ELSE
relname := NULL;
END IF;
toastrelschemaname := row_data.toastrelschemaname;
toastrelname := row_data.toastrelname;
seq_scan := row_data.seq_scan;
seq_tup_read := row_data.seq_tup_read;
idx_scan := row_data.idx_scan;
idx_tup_fetch := row_data.idx_tup_fetch;
n_tup_ins := row_data.n_tup_ins;
n_tup_upd := row_data.n_tup_upd;
n_tup_del := row_data.n_tup_del;
n_tup_hot_upd := row_data.n_tup_hot_upd;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.summary_stat_xact_all_tables AS
SELECT Ti.schemaname, COALESCE(Ti.relname, Tn.toastname, NULL) AS relname,
pg_catalog.SUM(Ti.seq_scan) seq_scan, pg_catalog.SUM(Ti.seq_tup_read) seq_tup_read, pg_catalog.SUM(Ti.idx_scan) idx_scan,
pg_catalog.SUM(Ti.idx_tup_fetch) idx_tup_fetch, pg_catalog.SUM(Ti.n_tup_ins) n_tup_ins, pg_catalog.SUM(Ti.n_tup_upd) n_tup_upd,
pg_catalog.SUM(Ti.n_tup_del) n_tup_del, pg_catalog.SUM(Ti.n_tup_hot_upd) n_tup_hot_upd
FROM dbe_perf.get_summary_stat_xact_all_tables() as Ti LEFT JOIN dbe_perf.get_local_toast_relation() AS Tn
ON (Tn.shemaname = Ti.toastrelschemaname AND Tn.relname = Ti.toastrelname)
GROUP BY (1, 2);
CREATE VIEW dbe_perf.stat_xact_sys_tables AS
SELECT * FROM dbe_perf.stat_xact_all_tables
WHERE schemaname IN ('pg_catalog', 'information_schema') OR
schemaname ~ '^pg_toast';
CREATE OR REPLACE FUNCTION dbe_perf.get_global_stat_xact_sys_tables
(OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT seq_scan bigint,
OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint,
OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint)
RETURNS setof record
AS $$
DECLARE
row_data dbe_perf.stat_xact_sys_tables%rowtype;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.stat_xact_sys_tables';
FOR row_data IN EXECUTE(query_str) LOOP
node_name := row_name.node_name;
relid := row_data.relid;
schemaname := row_data.schemaname;
relname := row_data.relname;
seq_scan := row_data.seq_scan;
seq_tup_read := row_data.seq_tup_read;
idx_scan := row_data.idx_scan;
idx_tup_fetch := row_data.idx_tup_fetch;
n_tup_ins := row_data.n_tup_ins;
n_tup_upd := row_data.n_tup_upd;
n_tup_del := row_data.n_tup_del;
n_tup_hot_upd := row_data.n_tup_hot_upd;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_stat_xact_sys_tables AS
SELECT * FROM dbe_perf.get_global_stat_xact_sys_tables();
CREATE OR REPLACE FUNCTION dbe_perf.get_summary_stat_xact_sys_tables
(OUT schemaname name, OUT relname name,
OUT toastrelschemaname name, OUT toastrelname name,
OUT seq_scan bigint, OUT seq_tup_read bigint,
OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint,
OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint)
RETURNS setof record
AS $$
DECLARE
row_data record;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := '
SELECT
T.relname AS relname,
T.schemaname AS schemaname,
C.relname AS toastrelname,
N.nspname AS toastrelschemaname,
T.seq_scan AS seq_scan,
T.seq_tup_read AS seq_tup_read,
T.idx_scan AS idx_scan,
T.idx_tup_fetch AS idx_tup_fetch,
T.n_tup_ins AS n_tup_ins,
T.n_tup_upd AS n_tup_upd,
T.n_tup_del AS n_tup_del,
T.n_tup_hot_upd AS n_tup_hot_upd
FROM dbe_perf.stat_xact_sys_tables T
LEFT JOIN pg_class C ON T.relid = C.reltoastrelid
LEFT JOIN pg_namespace N ON C.relnamespace = N.oid';
FOR row_data IN EXECUTE(query_str) LOOP
schemaname := row_data.schemaname;
IF row_data.toastrelname IS NULL THEN
relname := row_data.relname;
ELSE
relname := NULL;
END IF;
toastrelschemaname := row_data.toastrelschemaname;
toastrelname := row_data.toastrelname;
seq_scan := row_data.seq_scan;
seq_tup_read := row_data.seq_tup_read;
idx_scan := row_data.idx_scan;
idx_tup_fetch := row_data.idx_tup_fetch;
n_tup_ins := row_data.n_tup_ins;
n_tup_upd := row_data.n_tup_upd;
n_tup_del := row_data.n_tup_del;
n_tup_hot_upd := row_data.n_tup_hot_upd;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.summary_stat_xact_sys_tables AS
SELECT Ti.schemaname, COALESCE(Ti.relname, Tn.toastname) AS relname,
pg_catalog.SUM(Ti.seq_scan) seq_scan, pg_catalog.SUM(Ti.seq_tup_read) seq_tup_read, pg_catalog.SUM(Ti.idx_scan) idx_scan,
pg_catalog.SUM(Ti.idx_tup_fetch) idx_tup_fetch, pg_catalog.SUM(Ti.n_tup_ins) n_tup_ins, pg_catalog.SUM(Ti.n_tup_upd) n_tup_upd,
pg_catalog.SUM(Ti.n_tup_del) n_tup_del, pg_catalog.SUM(Ti.n_tup_hot_upd) n_tup_hot_upd
FROM dbe_perf.get_summary_stat_xact_sys_tables() as Ti LEFT JOIN dbe_perf.get_local_toast_relation() AS Tn
ON (Tn.shemaname = Ti.toastrelschemaname AND Tn.relname = Ti.toastrelname)
GROUP BY (1, 2);
CREATE VIEW dbe_perf.stat_xact_user_tables AS
SELECT * FROM dbe_perf.stat_xact_all_tables
WHERE schemaname NOT IN ('pg_catalog', 'information_schema') AND
schemaname !~ '^pg_toast';
CREATE OR REPLACE FUNCTION dbe_perf.get_global_stat_xact_user_tables
(OUT node_name name, OUT relid oid, OUT schemaname name, OUT relname name, OUT seq_scan bigint,
OUT seq_tup_read bigint, OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint,
OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint)
RETURNS setof record
AS $$
DECLARE
row_data dbe_perf.stat_xact_user_tables%rowtype;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.stat_xact_user_tables';
FOR row_data IN EXECUTE(query_str) LOOP
node_name := row_name.node_name;
relid := row_data.relid;
schemaname := row_data.schemaname;
relname := row_data.relname;
seq_scan := row_data.seq_scan;
seq_tup_read := row_data.seq_tup_read;
idx_scan := row_data.idx_scan;
idx_tup_fetch := row_data.idx_tup_fetch;
n_tup_ins := row_data.n_tup_ins;
n_tup_upd := row_data.n_tup_upd;
n_tup_del := row_data.n_tup_del;
n_tup_hot_upd := row_data.n_tup_hot_upd;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_stat_xact_user_tables AS
SELECT * FROM dbe_perf.get_global_stat_xact_user_tables();
CREATE OR REPLACE FUNCTION dbe_perf.get_summary_stat_xact_user_tables
(OUT schemaname name, OUT relname name,
OUT toastrelschemaname name, OUT toastrelname name,
OUT seq_scan bigint, OUT seq_tup_read bigint,
OUT idx_scan bigint, OUT idx_tup_fetch bigint, OUT n_tup_ins bigint,
OUT n_tup_upd bigint, OUT n_tup_del bigint, OUT n_tup_hot_upd bigint)
RETURNS setof record
AS $$
DECLARE
row_data record;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := '
SELECT
T.relname AS relname,
T.schemaname AS schemaname,
C.relname AS toastrelname,
N.nspname AS toastrelschemaname,
T.seq_scan AS seq_scan,
T.seq_tup_read AS seq_tup_read,
T.idx_scan AS idx_scan,
T.idx_tup_fetch AS idx_tup_fetch,
T.n_tup_ins AS n_tup_ins,
T.n_tup_upd AS n_tup_upd,
T.n_tup_del AS n_tup_del,
T.n_tup_hot_upd AS n_tup_hot_upd
FROM dbe_perf.stat_xact_user_tables T
LEFT JOIN pg_class C ON T.relid = C.reltoastrelid
LEFT JOIN pg_namespace N ON C.relnamespace = N.oid';
FOR row_data IN EXECUTE(query_str) LOOP
schemaname := row_data.schemaname;
IF row_data.toastrelname IS NULL THEN
relname := row_data.relname;
ELSE
relname := NULL;
END IF;
toastrelschemaname := row_data.toastrelschemaname;
toastrelname := row_data.toastrelname;
seq_scan := row_data.seq_scan;
seq_tup_read := row_data.seq_tup_read;
idx_scan := row_data.idx_scan;
idx_tup_fetch := row_data.idx_tup_fetch;
n_tup_ins := row_data.n_tup_ins;
n_tup_upd := row_data.n_tup_upd;
n_tup_del := row_data.n_tup_del;
n_tup_hot_upd := row_data.n_tup_hot_upd;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.summary_stat_xact_user_tables AS
SELECT Ti.schemaname, COALESCE(Ti.relname, Tn.toastname) AS relname,
pg_catalog.SUM(Ti.seq_scan) seq_scan, pg_catalog.SUM(Ti.seq_tup_read) seq_tup_read, pg_catalog.SUM(Ti.idx_scan) idx_scan,
pg_catalog.SUM(Ti.idx_tup_fetch) idx_tup_fetch, pg_catalog.SUM(Ti.n_tup_ins) n_tup_ins, pg_catalog.SUM(Ti.n_tup_upd) n_tup_upd,
pg_catalog.SUM(Ti.n_tup_del) n_tup_del, pg_catalog.SUM(Ti.n_tup_hot_upd) n_tup_hot_upd
FROM dbe_perf.get_summary_stat_xact_user_tables() AS Ti LEFT JOIN dbe_perf.get_local_toast_relation() AS Tn
ON (Tn.shemaname = Ti.toastrelschemaname AND Tn.relname = Ti.toastrelname)
GROUP BY (1, 2);
CREATE VIEW dbe_perf.stat_user_functions AS
SELECT
P.oid AS funcid,
N.nspname AS schemaname,
P.proname AS funcname,
pg_catalog.pg_stat_get_function_calls(P.oid) AS calls,
pg_catalog.pg_stat_get_function_total_time(P.oid) AS total_time,
pg_catalog.pg_stat_get_function_self_time(P.oid) AS self_time
FROM pg_proc P LEFT JOIN pg_namespace N ON (N.oid = P.pronamespace)
WHERE P.prolang != 12
AND pg_stat_get_function_calls(P.oid) IS NOT NULL;
CREATE OR REPLACE FUNCTION dbe_perf.get_global_stat_user_functions
(OUT node_name name, OUT funcid oid, OUT schemaname name, OUT funcname name, OUT calls bigint,
OUT total_time double precision, OUT self_time double precision)
RETURNS setof record
AS $$
DECLARE
row_data dbe_perf.stat_user_functions%rowtype;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.stat_user_functions';
FOR row_data IN EXECUTE(query_str) LOOP
node_name := row_name.node_name;
funcid := row_data.funcid;
schemaname := row_data.schemaname;
funcname := row_data.funcname;
calls := row_data.calls;
total_time := row_data.total_time;
self_time := row_data.self_time;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_stat_user_functions AS
SELECT * FROM dbe_perf.get_global_stat_user_functions();
CREATE VIEW dbe_perf.summary_stat_user_functions AS
SELECT schemaname, funcname,
pg_catalog.SUM(calls) calls, pg_catalog.SUM(total_time) total_time, pg_catalog.SUM(self_time) self_time
FROM dbe_perf.get_global_stat_user_functions()
GROUP BY (schemaname, funcname);
CREATE VIEW dbe_perf.stat_xact_user_functions AS
SELECT
P.oid AS funcid,
N.nspname AS schemaname,
P.proname AS funcname,
pg_catalog.pg_stat_get_xact_function_calls(P.oid) AS calls,
pg_catalog.pg_stat_get_xact_function_total_time(P.oid) AS total_time,
pg_catalog.pg_stat_get_xact_function_self_time(P.oid) AS self_time
FROM pg_proc P LEFT JOIN pg_namespace N ON (N.oid = P.pronamespace)
WHERE P.prolang != 12
AND pg_catalog.pg_stat_get_xact_function_calls(P.oid) IS NOT NULL;
CREATE OR REPLACE FUNCTION dbe_perf.get_global_stat_xact_user_functions
(OUT node_name name, OUT funcid oid, OUT schemaname name, OUT funcname name, OUT calls bigint,
OUT total_time double precision, OUT self_time double precision)
RETURNS setof record
AS $$
DECLARE
row_data dbe_perf.stat_xact_user_functions%rowtype;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.stat_xact_user_functions';
FOR row_data IN EXECUTE(query_str) LOOP
node_name := row_name.node_name;
funcid := row_data.funcid;
schemaname := row_data.schemaname;
funcname := row_data.funcname;
calls := row_data.calls;
total_time := row_data.total_time;
self_time := row_data.self_time;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_stat_xact_user_functions AS
SELECT * FROM dbe_perf.get_global_stat_xact_user_functions();
CREATE VIEW dbe_perf.summary_stat_xact_user_functions AS
SELECT schemaname, funcname,
pg_catalog.SUM(calls) calls, pg_catalog.SUM(total_time) total_time, pg_catalog.SUM(self_time) self_time
FROM dbe_perf.get_global_stat_xact_user_functions()
GROUP BY (schemaname, funcname);
CREATE VIEW dbe_perf.stat_bad_block AS
SELECT DISTINCT * from pg_stat_bad_block();
CREATE OR REPLACE FUNCTION dbe_perf.get_global_stat_bad_block
(OUT node_name TEXT, OUT databaseid INT4, OUT tablespaceid INT4, OUT relfilenode INT4, OUT forknum INT4,
OUT error_count INT4, OUT first_time timestamp with time zone, OUT last_time timestamp with time zone)
RETURNS setof record
AS $$
DECLARE
row_name record;
each_node_out record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.stat_bad_block';
FOR each_node_out IN EXECUTE(query_str) LOOP
node_name := row_name.node_name;
databaseid := each_node_out.databaseid;
tablespaceid := each_node_out.tablespaceid;
relfilenode := each_node_out.relfilenode;
forknum := each_node_out.forknum;
error_count := each_node_out.error_count;
first_time := each_node_out.first_time;
last_time := each_node_out.last_time;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_stat_bad_block AS
SELECT DISTINCT * from dbe_perf.get_global_stat_bad_block();
CREATE VIEW dbe_perf.summary_stat_bad_block AS
SELECT databaseid, tablespaceid, relfilenode,
pg_catalog.SUM(forknum) forknum, pg_catalog.SUM(error_count) error_count,
pg_catalog.MIN(first_time) first_time, pg_catalog.MAX(last_time) last_time
FROM dbe_perf.get_global_stat_bad_block()
GROUP BY (databaseid, tablespaceid, relfilenode);
CREATE VIEW dbe_perf.file_redo_iostat AS
SELECT * FROM pg_stat_get_redo_stat();
CREATE OR REPLACE FUNCTION dbe_perf.get_global_file_redo_iostat
(OUT node_name name, OUT phywrts bigint, OUT phyblkwrt bigint, OUT writetim bigint,
OUT avgiotim bigint, OUT lstiotim bigint, OUT miniotim bigint, OUT maxiowtm bigint)
RETURNS setof record
AS $$
DECLARE
row_data dbe_perf.file_redo_iostat%rowtype;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.file_redo_iostat';
FOR row_data IN EXECUTE(query_str) LOOP
node_name := row_name.node_name;
phywrts := row_data.phywrts;
phyblkwrt := row_data.phyblkwrt;
writetim := row_data.writetim;
avgiotim := row_data.avgiotim;
lstiotim := row_data.lstiotim;
miniotim := row_data.miniotim;
maxiowtm := row_data.maxiowtm;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_file_redo_iostat AS
SELECT * FROM dbe_perf.get_global_file_redo_iostat();
CREATE VIEW dbe_perf.summary_file_redo_iostat AS
SELECT
pg_catalog.sum(phywrts) AS phywrts,
pg_catalog.sum(phyblkwrt) AS phyblkwrt,
pg_catalog.sum(writetim) AS writetim,
((pg_catalog.sum(writetim) / greatest(pg_catalog.sum(phywrts), 1))::bigint) AS avgiotim,
pg_catalog.max(lstiotim) AS lstiotim,
pg_catalog.min(miniotim) AS miniotim,
pg_catalog.max(maxiowtm) AS maxiowtm
FROM dbe_perf.get_global_file_redo_iostat();
CREATE VIEW dbe_perf.local_rel_iostat AS
SELECT * FROM get_local_rel_iostat();
CREATE OR REPLACE FUNCTION dbe_perf.get_global_rel_iostat
(OUT node_name name, OUT phyrds bigint,
OUT phywrts bigint, OUT phyblkrd bigint, OUT phyblkwrt bigint)
RETURNS setof record
AS $$
DECLARE
row_data dbe_perf.local_rel_iostat%rowtype;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.local_rel_iostat';
FOR row_data IN EXECUTE(query_str) LOOP
node_name := row_name.node_name;
phyrds := row_data.phyrds;
phywrts := row_data.phywrts;
phyblkrd := row_data.phyblkrd;
phyblkwrt := row_data.phyblkwrt;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_rel_iostat AS
SELECT * FROM dbe_perf.get_global_rel_iostat();
CREATE VIEW dbe_perf.summary_rel_iostat AS
SELECT
pg_catalog.sum(phyrds) AS phyrds, pg_catalog.sum(phywrts) AS phywrts, pg_catalog.sum(phyblkrd) AS phyblkrd,
pg_catalog.sum(phyblkwrt) AS phyblkwrt
FROM dbe_perf.get_global_rel_iostat();
CREATE VIEW dbe_perf.file_iostat AS
SELECT * FROM pg_stat_get_file_stat();
CREATE OR REPLACE FUNCTION dbe_perf.get_global_file_iostat
(OUT node_name name, OUT filenum oid, OUT dbid oid, OUT spcid oid, OUT phyrds bigint,
OUT phywrts bigint, OUT phyblkrd bigint, OUT phyblkwrt bigint, OUT readtim bigint,
OUT writetim bigint, OUT avgiotim bigint, OUT lstiotim bigint, OUT miniotim bigint, OUT maxiowtm bigint)
RETURNS setof record
AS $$
DECLARE
row_data dbe_perf.file_iostat%rowtype;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.file_iostat';
FOR row_data IN EXECUTE(query_str) LOOP
node_name := row_name.node_name;
filenum := row_data.filenum;
dbid := row_data.dbid;
spcid := row_data.spcid;
phyrds := row_data.phyrds;
phywrts := row_data.phywrts;
phyblkrd := row_data.phyblkrd;
phyblkwrt := row_data.phyblkwrt;
readtim := row_data.readtim;
writetim := row_data.writetim;
avgiotim := row_data.avgiotim;
lstiotim := row_data.lstiotim;
miniotim := row_data.miniotim;
maxiowtm := row_data.maxiowtm;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_file_iostat AS
SELECT * FROM dbe_perf.get_global_file_iostat();
CREATE VIEW dbe_perf.summary_file_iostat AS
SELECT
filenum, dbid, spcid,
pg_catalog.sum(phyrds) AS phyrds, pg_catalog.sum(phywrts) AS phywrts, pg_catalog.sum(phyblkrd) AS phyblkrd,
pg_catalog.sum(phyblkwrt) AS phyblkwrt, pg_catalog.sum(readtim) AS readtim, pg_catalog.sum(writetim) AS writetim,
((pg_catalog.sum(readtim + writetim) / greatest(pg_catalog.sum(phyrds + phywrts), 1))::bigint) AS avgiotim,
pg_catalog.max(lstiotim) AS lstiotim, pg_catalog.min(miniotim) AS miniotim, pg_catalog.max(maxiowtm) AS maxiowtm
FROM dbe_perf.get_global_file_iostat()
GROUP by (filenum, dbid, spcid);
CREATE VIEW dbe_perf.locks AS
SELECT * FROM pg_lock_status() AS L;
CREATE OR REPLACE FUNCTION dbe_perf.get_global_locks
(OUT node_name name,
OUT locktype text,
OUT database oid,
OUT relation oid,
OUT page integer,
OUT tuple smallint,
OUT virtualxid text,
OUT transactionid xid,
OUT classid oid,
OUT objid oid,
OUT objsubid smallint,
OUT virtualtransaction text,
OUT pid bigint,
OUT mode text,
OUT granted boolean,
OUT fastpath boolean)
RETURNS setof record
AS $$
DECLARE
row_data dbe_perf.locks%rowtype;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.locks';
FOR row_data IN EXECUTE(query_str) LOOP
node_name := row_name.node_name;
locktype := row_data.locktype;
database := row_data.database;
relation := row_data.relation;
page := row_data.page;
tuple := row_data.tuple;
virtualxid := row_data.virtualxid;
transactionid := row_data.transactionid;
objid := row_data.objid;
objsubid := row_data.objsubid;
virtualtransaction := row_data.virtualtransaction;
pid := row_data.pid;
mode := row_data.mode;
granted := row_data.granted;
fastpath := row_data.fastpath;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_locks AS
SELECT * FROM dbe_perf.get_global_locks();
CREATE VIEW dbe_perf.replication_slots AS
SELECT
L.slot_name,
L.plugin,
L.slot_type,
L.datoid,
D.datname AS database,
L.active,
L.xmin,
L.catalog_xmin,
L.restart_lsn,
L.dummy_standby
FROM pg_get_replication_slots() AS L
LEFT JOIN pg_database D ON (L.datoid = D.oid);
CREATE OR REPLACE FUNCTION dbe_perf.get_global_replication_slots
(OUT node_name name,
OUT slot_name text,
OUT plugin text,
OUT slot_type text,
OUT datoid oid,
OUT database name,
OUT active boolean,
OUT x_min xid,
OUT catalog_xmin xid,
OUT restart_lsn text,
OUT dummy_standby boolean)
RETURNS setof record
AS $$
DECLARE
row_data dbe_perf.replication_slots%rowtype;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.replication_slots';
FOR row_data IN EXECUTE(query_str) LOOP
node_name := row_name.node_name;
slot_name := row_data.slot_name;
plugin := row_data.plugin;
slot_type := row_data.slot_type;
datoid := row_data.datoid;
database := row_data.database;
active := row_data.active;
x_min := row_data.xmin;
catalog_xmin := row_data.catalog_xmin;
restart_lsn := row_data.restart_lsn;
dummy_standby := row_data.dummy_standby;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_replication_slots AS
SELECT * FROM dbe_perf.get_global_replication_slots();
CREATE VIEW dbe_perf.bgwriter_stat AS
SELECT
pg_stat_get_bgwriter_timed_checkpoints() AS checkpoints_timed,
pg_stat_get_bgwriter_requested_checkpoints() AS checkpoints_req,
pg_stat_get_checkpoint_write_time() AS checkpoint_write_time,
pg_stat_get_checkpoint_sync_time() AS checkpoint_sync_time,
pg_stat_get_bgwriter_buf_written_checkpoints() AS buffers_checkpoint,
pg_stat_get_bgwriter_buf_written_clean() AS buffers_clean,
pg_stat_get_bgwriter_maxwritten_clean() AS maxwritten_clean,
pg_stat_get_buf_written_backend() AS buffers_backend,
pg_stat_get_buf_fsync_backend() AS buffers_backend_fsync,
pg_stat_get_buf_alloc() AS buffers_alloc,
pg_stat_get_bgwriter_stat_reset_time() AS stats_reset;
CREATE OR REPLACE FUNCTION dbe_perf.get_global_bgwriter_stat
(OUT node_name name,
OUT checkpoints_timed bigint,
OUT checkpoints_req bigint,
OUT checkpoint_write_time double precision,
OUT checkpoint_sync_time double precision,
OUT buffers_checkpoint bigint,
OUT buffers_clean bigint,
OUT maxwritten_clean bigint,
OUT buffers_backend bigint,
OUT buffers_backend_fsync bigint,
OUT buffers_alloc bigint,
OUT stats_reset timestamp with time zone)
RETURNS setof record
AS $$
DECLARE
row_data dbe_perf.bgwriter_stat%rowtype;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.bgwriter_stat';
FOR row_data IN EXECUTE(query_str) LOOP
node_name := row_name.node_name;
checkpoints_timed := row_data.checkpoints_timed;
checkpoints_req := row_data.checkpoints_req;
checkpoint_write_time := row_data.checkpoint_write_time;
checkpoint_sync_time := row_data.checkpoint_sync_time;
buffers_checkpoint := row_data.buffers_checkpoint;
buffers_clean := row_data.buffers_clean;
maxwritten_clean := row_data.maxwritten_clean;
buffers_backend := row_data.buffers_backend;
buffers_backend_fsync := row_data.buffers_backend_fsync;
buffers_alloc := row_data.buffers_alloc;
stats_reset := row_data.stats_reset;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_bgwriter_stat AS
SELECT * FROM dbe_perf.get_global_bgwriter_stat();
CREATE VIEW dbe_perf.replication_stat AS
SELECT
S.pid,
S.usesysid,
U.rolname AS usename,
S.application_name,
S.client_addr,
S.client_hostname,
S.client_port,
S.backend_start,
W.state,
W.sender_sent_location,
W.receiver_write_location,
W.receiver_flush_location,
W.receiver_replay_location,
W.sync_priority,
W.sync_state
FROM pg_catalog.pg_stat_get_activity(NULL) AS S, pg_authid U,
pg_stat_get_wal_senders() AS W
WHERE S.usesysid = U.oid AND
S.pid = W.pid;
CREATE OR REPLACE FUNCTION dbe_perf.get_global_replication_stat
(OUT node_name name,
OUT pid bigint,
OUT usesysid oid,
OUT usename name,
OUT application_name text,
OUT client_addr inet,
OUT client_hostname text,
OUT client_port integer,
OUT backend_start timestamp with time zone,
OUT state text,
OUT sender_sent_location text,
OUT receiver_write_location text,
OUT receiver_flush_location text,
OUT receiver_replay_location text,
OUT sync_priority integer,
OUT sync_state text)
RETURNS setof record
AS $$
DECLARE
row_data dbe_perf.replication_stat%rowtype;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.replication_stat';
FOR row_data IN EXECUTE(query_str) LOOP
node_name := row_name.node_name;
pid := row_data.pid;
usesysid := row_data.usesysid;
usename := row_data.usename;
client_addr := row_data.client_addr;
client_hostname := row_data.client_hostname;
client_port := row_data.client_port;
state := row_data.state;
sender_sent_location := row_data.sender_sent_location;
receiver_write_location := row_data.receiver_write_location;
receiver_flush_location := row_data.receiver_flush_location;
receiver_replay_location := row_data.receiver_replay_location;
sync_priority := row_data.sync_priority;
sync_state := row_data.sync_state;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_replication_stat AS
SELECT * FROM dbe_perf.get_global_replication_stat();
CREATE VIEW dbe_perf.transactions_running_xacts AS
SELECT * FROM pg_get_running_xacts();
CREATE OR REPLACE FUNCTION dbe_perf.get_global_transactions_running_xacts()
RETURNS setof dbe_perf.transactions_running_xacts
AS $$
DECLARE
row_data dbe_perf.transactions_running_xacts%rowtype;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.transactions_running_xacts';
FOR row_data IN EXECUTE(query_str) LOOP
return next row_data;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_transactions_running_xacts AS
SELECT DISTINCT * from dbe_perf.get_global_transactions_running_xacts();
CREATE OR REPLACE FUNCTION dbe_perf.get_summary_transactions_running_xacts()
RETURNS setof dbe_perf.transactions_running_xacts
AS $$
DECLARE
row_data dbe_perf.transactions_running_xacts%rowtype;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.transactions_running_xacts';
FOR row_data IN EXECUTE(query_str) LOOP
return next row_data;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.summary_transactions_running_xacts AS
SELECT DISTINCT * from dbe_perf.get_summary_transactions_running_xacts();
CREATE VIEW dbe_perf.transactions_prepared_xacts AS
SELECT P.transaction, P.gid, P.prepared,
U.rolname AS owner, D.datname AS database
FROM pg_prepared_xact() AS P
LEFT JOIN pg_authid U ON P.ownerid = U.oid
LEFT JOIN pg_database D ON P.dbid = D.oid;
CREATE OR REPLACE FUNCTION dbe_perf.get_global_transactions_prepared_xacts()
RETURNS setof dbe_perf.transactions_prepared_xacts
AS $$
DECLARE
row_data dbe_perf.transactions_prepared_xacts%rowtype;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.transactions_prepared_xacts';
FOR row_data IN EXECUTE(query_str) LOOP
return next row_data;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_transactions_prepared_xacts AS
SELECT DISTINCT * FROM dbe_perf.get_global_transactions_prepared_xacts();
CREATE OR REPLACE FUNCTION dbe_perf.get_summary_transactions_prepared_xacts()
RETURNS setof dbe_perf.transactions_prepared_xacts
AS $$
DECLARE
row_data dbe_perf.transactions_prepared_xacts%rowtype;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.transactions_prepared_xacts';
FOR row_data IN EXECUTE(query_str) LOOP
return next row_data;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.summary_transactions_prepared_xacts AS
SELECT DISTINCT * FROM dbe_perf.get_summary_transactions_prepared_xacts();
CREATE VIEW dbe_perf.statement AS
SELECT * FROM get_instr_unique_sql();
CREATE OR REPLACE FUNCTION dbe_perf.get_summary_statement()
RETURNS setof dbe_perf.statement
AS $$
DECLARE
row_data dbe_perf.statement%rowtype;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.statement';
FOR row_data IN EXECUTE(query_str) LOOP
return next row_data;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW DBE_PERF.statement_history AS
select * from pg_catalog.statement_history;
CREATE OR REPLACE FUNCTION DBE_PERF.get_global_full_sql_by_timestamp
(in start_timestamp timestamp with time zone,
in end_timestamp timestamp with time zone,
OUT node_name name,
OUT db_name name,
OUT schema_name name,
OUT origin_node integer,
OUT user_name name,
OUT application_name text,
OUT client_addr text,
OUT client_port integer,
OUT unique_query_id bigint,
OUT debug_query_id bigint,
OUT query text,
OUT start_time timestamp with time zone,
OUT finish_time timestamp with time zone,
OUT slow_sql_threshold bigint,
OUT transaction_id bigint,
OUT thread_id bigint,
OUT session_id bigint,
OUT n_soft_parse bigint,
OUT n_hard_parse bigint,
OUT query_plan text,
OUT n_returned_rows bigint,
OUT n_tuples_fetched bigint,
OUT n_tuples_returned bigint,
OUT n_tuples_inserted bigint,
OUT n_tuples_updated bigint,
OUT n_tuples_deleted bigint,
OUT n_blocks_fetched bigint,
OUT n_blocks_hit bigint,
OUT db_time bigint,
OUT cpu_time bigint,
OUT execution_time bigint,
OUT parse_time bigint,
OUT plan_time bigint,
OUT rewrite_time bigint,
OUT pl_execution_time bigint,
OUT pl_compilation_time bigint,
OUT data_io_time bigint,
OUT net_send_info text,
OUT net_recv_info text,
OUT net_stream_send_info text,
OUT net_stream_recv_info text,
OUT lock_count bigint,
OUT lock_time bigint,
OUT lock_wait_count bigint,
OUT lock_wait_time bigint,
OUT lock_max_count bigint,
OUT lwlock_count bigint,
OUT lwlock_wait_count bigint,
OUT lwlock_time bigint,
OUT lwlock_wait_time bigint,
OUT details bytea,
OUT is_slow_sql bool,
OUT trace_id text,
OUT advise text,
OUT net_send_time bigint,
OUT srt1_q bigint,
OUT srt2_simple_query bigint,
OUT srt3_analyze_rewrite bigint,
OUT srt4_plan_query bigint,
OUT srt5_light_query bigint,
OUT srt6_p bigint,
OUT srt7_b bigint,
OUT srt8_e bigint,
OUT srt9_d bigint,
OUT srt10_s bigint,
OUT srt11_c bigint,
OUT srt12_u bigint,
OUT srt13_before_query bigint,
OUT srt14_after_query bigint,
OUT rtt_unknown bigint,
OUT net_trans_time bigint
)
RETURNS setof record
AS $$
DECLARE
row_data pg_catalog.statement_history%rowtype;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM DBE_PERF.statement_history where start_time >= ''' ||$1|| ''' and start_time <= ''' || $2 || '''';
FOR row_data IN EXECUTE(query_str) LOOP
IF row_data.parent_query_id = 0 then
node_name := row_name.node_name;
db_name := row_data.db_name;
schema_name := row_data.schema_name;
origin_node := row_data.origin_node;
user_name := row_data.user_name;
application_name := row_data.application_name;
client_addr := row_data.client_addr;
client_port := row_data.client_port;
unique_query_id := row_data.unique_query_id;
debug_query_id := row_data.debug_query_id;
query := row_data.query;
start_time := row_data.start_time;
finish_time := row_data.finish_time;
slow_sql_threshold := row_data.slow_sql_threshold;
transaction_id := row_data.transaction_id;
thread_id := row_data.thread_id;
session_id := row_data.session_id;
n_soft_parse := row_data.n_soft_parse;
n_hard_parse := row_data.n_hard_parse;
query_plan := row_data.query_plan;
n_returned_rows := row_data.n_returned_rows;
n_tuples_fetched := row_data.n_tuples_fetched;
n_tuples_returned := row_data.n_tuples_returned;
n_tuples_inserted := row_data.n_tuples_inserted;
n_tuples_updated := row_data.n_tuples_updated;
n_tuples_deleted := row_data.n_tuples_deleted;
n_blocks_fetched := row_data.n_blocks_fetched;
n_blocks_hit := row_data.n_blocks_hit;
db_time := row_data.db_time;
cpu_time := row_data.cpu_time;
execution_time := row_data.execution_time;
parse_time := row_data.parse_time;
plan_time := row_data.plan_time;
rewrite_time := row_data.rewrite_time;
pl_execution_time := row_data.pl_execution_time;
pl_compilation_time := row_data.pl_compilation_time;
data_io_time := row_data.data_io_time;
net_send_info := row_data.net_send_info;
net_recv_info := row_data.net_recv_info;
net_stream_send_info := row_data.net_stream_send_info;
net_stream_recv_info := row_data.net_stream_recv_info;
lock_count := row_data.lock_count;
lock_time := row_data.lock_time;
lock_wait_count := row_data.lock_wait_count;
lock_wait_time := row_data.lock_wait_time;
lock_max_count := row_data.lock_max_count;
lwlock_count := row_data.lwlock_count;
lwlock_wait_count := row_data.lwlock_wait_count;
lwlock_time := row_data.lwlock_time;
lwlock_wait_time := row_data.lwlock_wait_time;
details := row_data.details;
is_slow_sql := row_data.is_slow_sql;
trace_id := row_data.trace_id;
advise := row_data.advise;
net_send_time := row_data.net_send_time;
srt1_q := row_data.srt1_q;
srt2_simple_query := row_data.srt2_simple_query;
srt3_analyze_rewrite := row_data.srt3_analyze_rewrite;
srt4_plan_query := row_data.srt4_plan_query;
srt5_light_query := row_data.srt5_light_query;
srt6_p := row_data.srt6_p;
srt7_b := row_data.srt7_b;
srt8_e := row_data.srt8_e;
srt9_d := row_data.srt9_d;
srt10_s := row_data.srt10_s;
srt11_c := row_data.srt11_c;
srt12_u := row_data.srt12_u;
srt13_before_query := row_data.srt13_before_query;
srt14_after_query := row_data.srt14_after_query;
rtt_unknown := row_data.rtt_unknown;
net_trans_time := row_data.net_trans_time;
return next;
END IF;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE OR REPLACE FUNCTION DBE_PERF.get_global_slow_sql_by_timestamp
(in start_timestamp timestamp with time zone,
in end_timestamp timestamp with time zone,
OUT node_name name,
OUT db_name name,
OUT schema_name name,
OUT origin_node integer,
OUT user_name name,
OUT application_name text,
OUT client_addr text,
OUT client_port integer,
OUT unique_query_id bigint,
OUT debug_query_id bigint,
OUT query text,
OUT start_time timestamp with time zone,
OUT finish_time timestamp with time zone,
OUT slow_sql_threshold bigint,
OUT transaction_id bigint,
OUT thread_id bigint,
OUT session_id bigint,
OUT n_soft_parse bigint,
OUT n_hard_parse bigint,
OUT query_plan text,
OUT n_returned_rows bigint,
OUT n_tuples_fetched bigint,
OUT n_tuples_returned bigint,
OUT n_tuples_inserted bigint,
OUT n_tuples_updated bigint,
OUT n_tuples_deleted bigint,
OUT n_blocks_fetched bigint,
OUT n_blocks_hit bigint,
OUT db_time bigint,
OUT cpu_time bigint,
OUT execution_time bigint,
OUT parse_time bigint,
OUT plan_time bigint,
OUT rewrite_time bigint,
OUT pl_execution_time bigint,
OUT pl_compilation_time bigint,
OUT data_io_time bigint,
OUT net_send_info text,
OUT net_recv_info text,
OUT net_stream_send_info text,
OUT net_stream_recv_info text,
OUT lock_count bigint,
OUT lock_time bigint,
OUT lock_wait_count bigint,
OUT lock_wait_time bigint,
OUT lock_max_count bigint,
OUT lwlock_count bigint,
OUT lwlock_wait_count bigint,
OUT lwlock_time bigint,
OUT lwlock_wait_time bigint,
OUT details bytea,
OUT is_slow_sql bool,
OUT trace_id text,
OUT advise text,
OUT net_send_time bigint,
OUT srt1_q bigint,
OUT srt2_simple_query bigint,
OUT srt3_analyze_rewrite bigint,
OUT srt4_plan_query bigint,
OUT srt5_light_query bigint,
OUT srt6_p bigint,
OUT srt7_b bigint,
OUT srt8_e bigint,
OUT srt9_d bigint,
OUT srt10_s bigint,
OUT srt11_c bigint,
OUT srt12_u bigint,
OUT srt13_before_query bigint,
OUT srt14_after_query bigint,
OUT rtt_unknown bigint,
OUT net_trans_time bigint)
RETURNS setof record
AS $$
DECLARE
row_data pg_catalog.statement_history%rowtype;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM DBE_PERF.statement_history where start_time >= ''' ||$1|| ''' and start_time <= ''' || $2 || ''' and is_slow_sql = true ';
FOR row_data IN EXECUTE(query_str) LOOP
IF row_data.parent_query_id = 0 THEN
node_name := row_name.node_name;
db_name := row_data.db_name;
schema_name := row_data.schema_name;
origin_node := row_data.origin_node;
user_name := row_data.user_name;
application_name := row_data.application_name;
client_addr := row_data.client_addr;
client_port := row_data.client_port;
unique_query_id := row_data.unique_query_id;
debug_query_id := row_data.debug_query_id;
query := row_data.query;
start_time := row_data.start_time;
finish_time := row_data.finish_time;
slow_sql_threshold := row_data.slow_sql_threshold;
transaction_id := row_data.transaction_id;
thread_id := row_data.thread_id;
session_id := row_data.session_id;
n_soft_parse := row_data.n_soft_parse;
n_hard_parse := row_data.n_hard_parse;
query_plan := row_data.query_plan;
n_returned_rows := row_data.n_returned_rows;
n_tuples_fetched := row_data.n_tuples_fetched;
n_tuples_returned := row_data.n_tuples_returned;
n_tuples_inserted := row_data.n_tuples_inserted;
n_tuples_updated := row_data.n_tuples_updated;
n_tuples_deleted := row_data.n_tuples_deleted;
n_blocks_fetched := row_data.n_blocks_fetched;
n_blocks_hit := row_data.n_blocks_hit;
db_time := row_data.db_time;
cpu_time := row_data.cpu_time;
execution_time := row_data.execution_time;
parse_time := row_data.parse_time;
plan_time := row_data.plan_time;
rewrite_time := row_data.rewrite_time;
pl_execution_time := row_data.pl_execution_time;
pl_compilation_time := row_data.pl_compilation_time;
data_io_time := row_data.data_io_time;
net_send_info := row_data.net_send_info;
net_recv_info := row_data.net_recv_info;
net_stream_send_info := row_data.net_stream_send_info;
net_stream_recv_info := row_data.net_stream_recv_info;
lock_count := row_data.lock_count;
lock_time := row_data.lock_time;
lock_wait_count := row_data.lock_wait_count;
lock_wait_time := row_data.lock_wait_time;
lock_max_count := row_data.lock_max_count;
lwlock_count := row_data.lwlock_count;
lwlock_wait_count := row_data.lwlock_wait_count;
lwlock_time := row_data.lwlock_time;
lwlock_wait_time := row_data.lwlock_wait_time;
details := row_data.details;
is_slow_sql := row_data.is_slow_sql;
trace_id := row_data.trace_id;
advise := row_data.advise;
net_send_time := row_data.net_send_time;
srt1_q := row_data.srt1_q;
srt2_simple_query := row_data.srt2_simple_query;
srt3_analyze_rewrite := row_data.srt3_analyze_rewrite;
srt4_plan_query := row_data.srt4_plan_query;
srt5_light_query := row_data.srt5_light_query;
srt6_p := row_data.srt6_p;
srt7_b := row_data.srt7_b;
srt8_e := row_data.srt8_e;
srt9_d := row_data.srt9_d;
srt10_s := row_data.srt10_s;
srt11_c := row_data.srt11_c;
srt12_u := row_data.srt12_u;
srt13_before_query := row_data.srt13_before_query;
srt14_after_query := row_data.srt14_after_query;
rtt_unknown := row_data.rtt_unknown;
net_trans_time := row_data.net_trans_time;
return next;
END IF;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.summary_statement AS
SELECT * FROM dbe_perf.get_summary_statement();
CREATE VIEW dbe_perf.statement_count AS
SELECT
node_name,
user_name,
select_count,
update_count,
insert_count,
delete_count,
mergeinto_count,
ddl_count,
dml_count,
dcl_count,
total_select_elapse,
avg_select_elapse,
max_select_elapse,
min_select_elapse,
total_update_elapse,
avg_update_elapse,
max_update_elapse,
min_update_elapse,
total_insert_elapse,
avg_insert_elapse,
max_insert_elapse,
min_insert_elapse,
total_delete_elapse,
avg_delete_elapse,
max_delete_elapse,
min_delete_elapse
FROM pg_stat_get_sql_count();
CREATE OR REPLACE FUNCTION dbe_perf.get_global_statement_count()
RETURNS setof dbe_perf.statement_count
AS $$
DECLARE
row_data dbe_perf.statement_count%rowtype;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.statement_count';
FOR row_data IN EXECUTE(query_str) LOOP
return next row_data;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql';
CREATE VIEW dbe_perf.global_statement_count AS
SELECT * FROM dbe_perf.get_global_statement_count();
CREATE VIEW dbe_perf.summary_statement_count AS
SELECT
user_name,
pg_catalog.SUM(select_count) AS select_count, pg_catalog.SUM(update_count) AS update_count,
pg_catalog.SUM(insert_count) AS insert_count, pg_catalog.SUM(delete_count) AS delete_count,
pg_catalog.SUM(mergeinto_count) AS mergeinto_count, pg_catalog.SUM(ddl_count) AS ddl_count,
pg_catalog.SUM(dml_count) AS dml_count, pg_catalog.SUM(dcl_count) AS dcl_count,
pg_catalog.SUM(total_select_elapse) AS total_select_elapse,
((pg_catalog.SUM(total_select_elapse) / greatest(pg_catalog.SUM(select_count), 1))::bigint) AS avg_select_elapse,
pg_catalog.MAX(max_select_elapse) AS max_select_elapse, pg_catalog.MIN(min_select_elapse) AS min_select_elapse,
pg_catalog.SUM(total_update_elapse) AS total_update_elapse,
((pg_catalog.SUM(total_update_elapse) / greatest(pg_catalog.SUM(update_count), 1))::bigint) AS avg_update_elapse,
pg_catalog.MAX(max_update_elapse) AS max_update_elapse, pg_catalog.MIN(min_update_elapse) AS min_update_elapse,
pg_catalog.SUM(total_insert_elapse) AS total_insert_elapse,
((pg_catalog.SUM(total_insert_elapse) / greatest(pg_catalog.SUM(insert_count), 1))::bigint) AS avg_insert_elapse,
pg_catalog.MAX(max_insert_elapse) AS max_insert_elapse, pg_catalog.MIN(min_insert_elapse) AS min_insert_elapse,
pg_catalog.SUM(total_delete_elapse) AS total_delete_elapse,
((pg_catalog.SUM(total_delete_elapse) / greatest(pg_catalog.SUM(delete_count), 1))::bigint) AS avg_delete_elapse,
pg_catalog.MAX(max_delete_elapse) AS max_delete_elapse, pg_catalog.MIN(min_delete_elapse) AS min_delete_elapse
FROM dbe_perf.get_global_statement_count() GROUP by (user_name);
CREATE VIEW dbe_perf.config_settings AS
SELECT * FROM pg_show_all_settings();
CREATE OR REPLACE FUNCTION dbe_perf.get_global_config_settings
(out node_name text,
out name text,
out setting text,
out unit text,
out category text,
out short_desc text,
out extra_desc text,
out context text,
out vartype text,
out source text,
out min_val text,
out max_val text,
out enumvals text[],
out boot_val text,
out reset_val text,
out sourcefile text,
out sourceline integer)
RETURNS setof record
AS $$
DECLARE
row_data dbe_perf.config_settings%rowtype;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.config_settings';
FOR row_data IN EXECUTE(query_str) LOOP
node_name := row_name.node_name;
name := row_data.name;
setting := row_data.setting;
unit := row_data.unit;
category := row_data.category;
short_desc := row_data.short_desc;
extra_desc := row_data.extra_desc;
context := row_data.context;
vartype := row_data.vartype;
source := row_data.source;
min_val := row_data.min_val;
max_val := row_data.max_val;
enumvals := row_data.enumvals;
boot_val := row_data.boot_val;
reset_val := row_data.reset_val;
sourcefile := row_data.sourcefile;
sourceline := row_data.sourceline;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql';
CREATE VIEW dbe_perf.global_config_settings AS
SELECT * FROM dbe_perf.get_global_config_settings();
CREATE VIEW dbe_perf.wait_events AS
SELECT * FROM pg_catalog.get_instr_wait_event(NULL);
CREATE OR REPLACE FUNCTION dbe_perf.get_global_wait_events()
RETURNS setof dbe_perf.wait_events
AS $$
DECLARE
row_data dbe_perf.wait_events%rowtype;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'SELECT * FROM dbe_perf.wait_events';
FOR row_data IN EXECUTE(query_str) LOOP
return next row_data;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_wait_events AS
SELECT * FROM dbe_perf.get_global_wait_events();
CREATE OR REPLACE FUNCTION dbe_perf.get_statement_responsetime_percentile(OUT p80 bigint, OUT p95 bigint)
RETURNS SETOF RECORD
AS $$
DECLARE
ROW_DATA RECORD;
ROW_NAME RECORD;
QUERY_STR TEXT;
QUERY_STR_NODES TEXT;
BEGIN
QUERY_STR_NODES := 'select * from dbe_perf.node_name';
FOR ROW_NAME IN EXECUTE(QUERY_STR_NODES) LOOP
QUERY_STR := 'SELECT * FROM pg_catalog.get_instr_rt_percentile(0)';
FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP
p80 = ROW_DATA."P80";
p95 = ROW_DATA."P95";
RETURN NEXT;
END LOOP;
END LOOP;
RETURN;
END; $$
LANGUAGE 'plpgsql';
CREATE VIEW dbe_perf.statement_responsetime_percentile AS
select * from dbe_perf.get_statement_responsetime_percentile();
CREATE VIEW dbe_perf.user_login AS
SELECT * FROM get_instr_user_login();
CREATE OR REPLACE FUNCTION dbe_perf.get_summary_user_login()
RETURNS SETOF dbe_perf.user_login
AS $$
DECLARE
ROW_DATA dbe_perf.user_login%ROWTYPE;
ROW_NAME RECORD;
QUERY_STR TEXT;
QUERY_STR_NODES TEXT;
BEGIN
QUERY_STR_NODES := 'select * from dbe_perf.node_name';
FOR ROW_NAME IN EXECUTE(QUERY_STR_NODES) LOOP
QUERY_STR := 'SELECT * FROM dbe_perf.user_login';
FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP
RETURN NEXT ROW_DATA;
END LOOP;
END LOOP;
RETURN;
END; $$
LANGUAGE 'plpgsql';
CREATE VIEW dbe_perf.summary_user_login AS
SELECT * FROM dbe_perf.get_summary_user_login();
CREATE VIEW dbe_perf.class_vital_info AS
SELECT
C.oid AS relid,
N.nspname AS schemaname,
C.relname AS relname,
C.relkind AS relkind
FROM pg_class C LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
WHERE C.relkind IN ('r', 't', 'i', 'I');
CREATE OR REPLACE FUNCTION dbe_perf.get_global_record_reset_time(OUT node_name text, OUT reset_time timestamp with time zone)
RETURNS setof record
AS $$
DECLARE
row_data record;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'select * from dbe_perf.node_name';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'select * from pg_catalog.get_node_stat_reset_time()';
FOR row_data IN EXECUTE(query_str) LOOP
node_name := row_name.node_name;
reset_time := row_data.get_node_stat_reset_time;
return next;
END LOOP;
END LOOP;
RETURN;
END; $$
LANGUAGE 'plpgsql';
CREATE VIEW dbe_perf.global_candidate_status AS
SELECT node_name, candidate_slots, get_buf_from_list, get_buf_clock_sweep, seg_candidate_slots, seg_get_buf_from_list, seg_get_buf_clock_sweep
FROM pg_catalog.local_candidate_stat();
CREATE VIEW dbe_perf.global_ckpt_status AS
SELECT node_name,ckpt_redo_point,ckpt_clog_flush_num,ckpt_csnlog_flush_num,ckpt_multixact_flush_num,ckpt_predicate_flush_num,ckpt_twophase_flush_num
FROM pg_catalog.local_ckpt_stat();
CREATE OR REPLACE VIEW dbe_perf.global_double_write_status AS
SELECT node_name, curr_dwn, curr_start_page, file_trunc_num, file_reset_num,
total_writes, low_threshold_writes, high_threshold_writes,
total_pages, low_threshold_pages, high_threshold_pages, file_id
FROM pg_catalog.local_double_write_stat();
CREATE OR REPLACE VIEW DBE_PERF.global_single_flush_dw_status AS
SELECT node_name, curr_dwn, curr_start_page, total_writes, file_trunc_num, file_reset_num
FROM pg_catalog.local_single_flush_dw_stat();
CREATE VIEW dbe_perf.global_pagewriter_status AS
SELECT node_name,pgwr_actual_flush_total_num,pgwr_last_flush_num,remain_dirty_page_num,queue_head_page_rec_lsn,queue_rec_lsn,current_xlog_insert_lsn,ckpt_redo_point
FROM pg_catalog.local_pagewriter_stat();
CREATE VIEW dbe_perf.global_record_reset_time AS
SELECT * FROM dbe_perf.get_global_record_reset_time();
CREATE OR REPLACE VIEW dbe_perf.global_redo_status AS
SELECT node_name, redo_start_ptr, redo_start_time, redo_done_time, curr_time,
min_recovery_point, read_ptr, last_replayed_read_ptr, recovery_done_ptr,
read_xlog_io_counter, read_xlog_io_total_dur, read_data_io_counter, read_data_io_total_dur,
write_data_io_counter, write_data_io_total_dur, process_pending_counter, process_pending_total_dur,
apply_counter, apply_total_dur,
speed, local_max_ptr, primary_flush_ptr, worker_info
FROM pg_catalog.local_redo_stat();
CREATE OR REPLACE VIEW dbe_perf.global_rto_status AS
SELECT node_name, rto_info
FROM pg_catalog.local_rto_stat();
CREATE OR REPLACE VIEW dbe_perf.global_streaming_hadr_rto_and_rpo_stat AS
SELECT hadr_sender_node_name, hadr_receiver_node_name, current_rto, target_rto, current_rpo, target_rpo, rto_sleep_time, rpo_sleep_time
FROM pg_catalog.gs_hadr_local_rto_and_rpo_stat();
CREATE OR REPLACE VIEW dbe_perf.global_recovery_status AS
SELECT node_name, standby_node_name, source_ip, source_port, dest_ip, dest_port, current_rto, target_rto, current_sleep_time
FROM pg_catalog.local_recovery_status();
CREATE VIEW dbe_perf.local_threadpool_status AS
SELECT * FROM threadpool_status();
CREATE OR REPLACE FUNCTION dbe_perf.global_threadpool_status()
RETURNS SETOF dbe_perf.local_threadpool_status
AS $$
DECLARE
ROW_DATA dbe_perf.local_threadpool_status%ROWTYPE;
ROW_NAME RECORD;
QUERY_STR TEXT;
QUERY_STR_NODES TEXT;
BEGIN
QUERY_STR_NODES := 'select * from dbe_perf.node_name';
FOR ROW_NAME IN EXECUTE(QUERY_STR_NODES) LOOP
QUERY_STR := 'SELECT * FROM dbe_perf.local_threadpool_status';
FOR ROW_DATA IN EXECUTE(QUERY_STR) LOOP
RETURN NEXT ROW_DATA;
END LOOP;
END LOOP;
RETURN;
END; $$
LANGUAGE 'plpgsql';
CREATE VIEW dbe_perf.global_threadpool_status AS
SELECT * FROM dbe_perf.global_threadpool_status();
CREATE VIEW dbe_perf.gs_slow_query_info AS
SELECT
S.dbname,
S.schemaname,
S.nodename,
S.username,
S.queryid,
S.query,
S.start_time,
S.finish_time,
S.duration,
S.query_plan,
S.n_returned_rows,
S.n_tuples_fetched,
S.n_tuples_returned,
S.n_tuples_inserted,
S.n_tuples_updated,
S.n_tuples_deleted,
S.n_blocks_fetched,
S.n_blocks_hit,
S.db_time,
S.cpu_time,
S.execution_time,
S.parse_time,
S.plan_time,
S.rewrite_time,
S.pl_execution_time,
S.pl_compilation_time,
S.net_send_time,
S.data_io_time,
S.srt1_q,
S.srt2_simple_query,
S.srt3_analyze_rewrite,
S.srt4_plan_query,
S.srt5_light_query,
S.srt6_p,
S.srt7_b,
S.srt8_e,
S.srt9_d,
S.srt10_s,
S.srt11_c,
S.srt12_u,
S.srt13_before_query,
S.srt14_after_query,
S.rtt_unknown
FROM gs_wlm_session_query_info_all S where S.is_slow_query = 1;
CREATE VIEW dbe_perf.gs_slow_query_history AS
SELECT
S.dbname,
S.schemaname,
S.nodename,
S.username,
S.queryid,
S.query,
S.start_time,
S.finish_time,
S.duration,
S.query_plan,
S.n_returned_rows,
S.n_tuples_fetched,
S.n_tuples_returned,
S.n_tuples_inserted,
S.n_tuples_updated,
S.n_tuples_deleted,
S.n_blocks_fetched,
S.n_blocks_hit,
S.db_time,
S.cpu_time,
S.execution_time,
S.parse_time,
S.plan_time,
S.rewrite_time,
S.pl_execution_time,
S.pl_compilation_time,
S.net_send_time,
S.data_io_time,
S.srt1_q,
S.srt2_simple_query,
S.srt3_analyze_rewrite,
S.srt4_plan_query,
S.srt5_light_query,
S.srt6_p,
S.srt7_b,
S.srt8_e,
S.srt9_d,
S.srt10_s,
S.srt11_c,
S.srt12_u,
S.srt13_before_query,
S.srt14_after_query,
S.rtt_unknown
FROM pg_catalog.pg_stat_get_wlm_session_info(0) S where S.is_slow_query = 1;
CREATE OR REPLACE FUNCTION dbe_perf.global_slow_query_history
RETURNS setof dbe_perf.gs_slow_query_history
AS $$
DECLARE
row_data dbe_perf.gs_slow_query_history%rowtype;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM dbe_perf.gs_slow_query_history''';
FOR row_data IN EXECUTE(query_str) LOOP
return next row_data;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE OR REPLACE FUNCTION dbe_perf.global_slow_query_info()
RETURNS setof dbe_perf.gs_slow_query_info
AS $$
DECLARE
row_data dbe_perf.gs_slow_query_info%rowtype;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT * FROM dbe_perf.gs_slow_query_info''';
FOR row_data IN EXECUTE(query_str) LOOP
return next row_data;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE OR REPLACE FUNCTION dbe_perf.global_slow_query_info_bytime(text, TIMESTAMP, TIMESTAMP, int)
RETURNS setof dbe_perf.gs_slow_query_info
AS $$
DECLARE
row_data dbe_perf.gs_slow_query_info%rowtype;
row_name record;
query_str text;
query_str_nodes text;
query_str_cn text;
BEGIN
IF $1 IN ('start_time', 'finish_time') THEN
ELSE
raise WARNING 'Illegal character entered for function, colname must be start_time or finish_time';
return;
END IF;
query_str_nodes := 'SELECT node_name FROM pgxc_node WHERE node_type=''C'' AND nodeis_active = true';
query_str_cn := 'SELECT * FROM dbe_perf.gs_slow_query_info where '||$1||'>'''''||$2||''''' and '||$1||'<'''''||$3||''''' limit '||$4;
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''' || query_str_cn||''';';
FOR row_data IN EXECUTE(query_str) LOOP
return next row_data;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE 'plpgsql' NOT FENCED;
CREATE VIEW dbe_perf.global_slow_query_history AS
SELECT * FROM dbe_perf.global_slow_query_history();
CREATE VIEW dbe_perf.global_slow_query_info AS
SELECT * FROM dbe_perf.global_slow_query_info();
CREATE VIEW DBE_PERF.global_plancache_status AS
SELECT * FROM pg_catalog.plancache_status();
CREATE VIEW DBE_PERF.global_plancache_clean AS
SELECT * FROM pg_catalog.plancache_clean();
CREATE OR REPLACE VIEW DBE_PERF.local_active_session AS
WITH RECURSIVE
las(sampleid, sample_time, need_flush_sample, databaseid, thread_id, sessionid, start_time, event, lwtid, psessionid,
tlevel, smpid, userid, application_name, client_addr, client_hostname, client_port, query_id, unique_query_id,
user_id, cn_id, unique_query, locktag, lockmode, block_sessionid, wait_status, global_sessionid, xact_start_time, query_start_time, state)
AS (select t.* from get_local_active_session() as t),
tt(sampleid, sample_time, need_flush_sample, databaseid, thread_id, sessionid, start_time, event, lwtid, psessionid,
tlevel, smpid, userid, application_name, client_addr, client_hostname, client_port, query_id, unique_query_id,
user_id, cn_id, unique_query, locktag, lockmode, block_sessionid, wait_status, global_sessionid, xact_start_time, query_start_time, state, final_block_sessionid, level, head)
AS(SELECT las.*, las.block_sessionid AS final_block_sessionid, 1 AS level, pg_catalog.array_append('{}', las.sessionid) AS head FROM las
UNION ALL
SELECT tt.sampleid, tt.sample_time, tt.need_flush_sample, tt.databaseid, tt.thread_id, tt.sessionid, tt.start_time, tt.event, tt.lwtid, tt.psessionid,
tt.tlevel, tt.smpid, tt.userid, tt.application_name, tt.client_addr, tt.client_hostname, tt.client_port, tt.query_id, tt.unique_query_id,
tt.user_id, tt.cn_id, tt.unique_query, tt.locktag, tt.lockmode, tt.block_sessionid, tt.wait_status, tt.global_sessionid, tt.xact_start_time, tt.query_start_time, tt.state,
las.block_sessionid AS final_block_sessionid, tt.level + 1 AS level, pg_catalog.array_append(tt.head, las.sessionid) AS head
FROM tt INNER JOIN las ON tt.final_block_sessionid = las.sessionid
WHERE las.sampleid = tt.sampleid AND (las.block_sessionid IS NOT NULL OR las.block_sessionid != 0)
AND las.sessionid != all(head) AND las.sessionid != las.block_sessionid)
SELECT sampleid, sample_time, need_flush_sample, databaseid, thread_id, sessionid, start_time, event, lwtid, psessionid,
tlevel, smpid, userid, application_name, client_addr, client_hostname, client_port, query_id, unique_query_id,
user_id, cn_id, unique_query, locktag, lockmode, block_sessionid, final_block_sessionid, wait_status, global_sessionid, xact_start_time, query_start_time, state FROM tt
WHERE level = (SELECT pg_catalog.MAX(level) FROM tt t1 WHERE t1.sampleid = tt.sampleid AND t1.sessionid = tt.sessionid);
grant select on all tables in schema dbe_perf to public;