blob: 62bde4e3d96fb54331d302e197b6c158834f81fb [file]
/*
* Greenplum System Summary Views
*
* Portions Copyright (c) 2006-2010, Greenplum inc.
* Portions Copyright (c) 2012-Present VMware, Inc. or its affiliates.
* Copyright (c) 1996-2019, PostgreSQL Global Development Group
*
* src/backend/catalog/system_views_gp_summary.sql
*
* This file contains summary views for various Greenplum system catalog
* views. These summary views are designed to provide aggregated or averaged
* information for partitioned and replicated tables, considering multiple
* segments in a Greenplum database.
*
* Note: this file is read in single-user -j mode, which means that the
* command terminator is semicolon-newline-newline; whenever the backend
* sees that, it stops and executes what it's got. If you write a lot of
* statements without empty lines between, they'll all get quoted to you
* in any error message about one of them, so don't do that. Also, you
* cannot write a semicolon immediately followed by an empty line in a
* string literal (including a function body!) or a multiline comment.
*/
CREATE VIEW gp_stat_archiver_summary AS
SELECT
sum(gsa.archived_count) as archived_count,
max(gsa.last_archived_wal) as last_archived_wal,
max(gsa.last_archived_time) as last_archived_time,
sum(gsa.failed_count) as failed_count,
max(gsa.last_failed_wal) as last_failed_wal,
max(gsa.last_failed_time) as last_failed_time,
max(gsa.stats_reset) as stats_reset
FROM
gp_stat_archiver gsa;
CREATE VIEW gp_stat_bgwriter_summary AS
SELECT
sum(gsb.checkpoints_timed) as checkpoints_timed,
sum(gsb.checkpoints_req) as checkpoints_req,
sum(gsb.checkpoint_write_time) as checkpoint_write_time,
sum(gsb.checkpoint_sync_time) as checkpoint_sync_time,
sum(gsb.buffers_checkpoint) as buffers_checkpoint,
sum(gsb.buffers_clean) as buffers_clean,
sum(gsb.maxwritten_clean) as maxwritten_clean,
sum(gsb.buffers_backend) as buffers_backend,
sum(gsb.buffers_backend_fsync) as buffers_backend_fsync,
sum(gsb.buffers_alloc) as buffers_alloc,
max(gsb.stats_reset) as stats_reset
FROM
gp_stat_bgwriter gsb;
CREATE VIEW gp_stat_wal_summary AS
SELECT
sum(gsw.wal_records) as wal_records,
sum(gsw.wal_fpw) as wal_fpw,
sum(gsw.wal_bytes) as wal_bytes,
sum(gsw.wal_buffers_full) as wal_buffers_full,
sum(gsw.wal_write) as wal_write,
sum(gsw.wal_sync) as wal_sync,
sum(gsw.wal_write_time) as wal_write_time,
sum(gsw.wal_sync_time) as wal_sync_time,
max(gsw.stats_reset) as stats_reset
from
gp_stat_wal gsw;
CREATE VIEW gp_stat_database_summary AS
SELECT
sdb.datid,
sdb.datname,
sum(sdb.numbackends) as numbackends,
max(sdb.xact_commit) as xact_commit,
max(sdb.xact_rollback) as xact_rollback,
sum(sdb.blks_read) as blks_read,
sum(sdb.blks_hit) as blks_hit,
sum(sdb.tup_returned) as tup_returned,
sum(sdb.tup_fetched) as tup_fetched,
sum(sdb.tup_inserted) as tup_inserted,
sum(sdb.tup_updated) as tup_updated,
sum(sdb.tup_deleted) as tup_deleted,
max(sdb.conflicts) as conflicts,
sum(sdb.temp_files) as temp_files,
sum(sdb.temp_bytes) as temp_bytes,
sum(sdb.deadlocks) as deadlocks,
sum(sdb.checksum_failures) as checksum_failures,
max(sdb.checksum_last_failure) as checksum_last_failure,
sum(sdb.blk_read_time) as blk_read_time,
sum(sdb.blk_write_time) as blk_write_time,
max(sdb.stats_reset) as stats_reset
FROM
gp_stat_database sdb
GROUP BY
sdb.datid,
sdb.datname;
-- Gather data from segments on user tables, and use data on coordinator on system tables.
CREATE VIEW gp_stat_all_tables_summary AS
SELECT
s.relid,
s.schemaname,
s.relname,
m.seq_scan,
m.last_seq_scan,
m.seq_tup_read,
m.idx_scan,
m.last_idx_scan,
m.idx_tup_fetch,
m.n_tup_ins,
m.n_tup_upd,
m.n_tup_del,
m.n_tup_hot_upd,
m.n_live_tup,
m.n_dead_tup,
m.n_mod_since_analyze,
s.last_vacuum,
s.last_autovacuum,
s.last_analyze,
s.last_autoanalyze,
s.vacuum_count,
s.autovacuum_count,
s.analyze_count,
s.autoanalyze_count
FROM
(SELECT
allt.relid,
allt.schemaname,
allt.relname,
case when d.policytype = 'r' then (sum(seq_scan)/d.numsegments)::bigint else sum(seq_scan) end seq_scan,
max(last_seq_scan) as last_seq_scan,
case when d.policytype = 'r' then (sum(seq_tup_read)/d.numsegments)::bigint else sum(seq_tup_read) end seq_tup_read,
case when d.policytype = 'r' then (sum(idx_scan)/d.numsegments)::bigint else sum(idx_scan) end idx_scan,
max(last_idx_scan) as last_idx_scan,
case when d.policytype = 'r' then (sum(idx_tup_fetch)/d.numsegments)::bigint else sum(idx_tup_fetch) end idx_tup_fetch,
case when d.policytype = 'r' then (sum(n_tup_ins)/d.numsegments)::bigint else sum(n_tup_ins) end n_tup_ins,
case when d.policytype = 'r' then (sum(n_tup_upd)/d.numsegments)::bigint else sum(n_tup_upd) end n_tup_upd,
case when d.policytype = 'r' then (sum(n_tup_del)/d.numsegments)::bigint else sum(n_tup_del) end n_tup_del,
case when d.policytype = 'r' then (sum(n_tup_hot_upd)/d.numsegments)::bigint else sum(n_tup_hot_upd) end n_tup_hot_upd,
case when d.policytype = 'r' then (sum(n_tup_newpage_upd)/d.numsegments)::bigint else sum(n_tup_newpage_upd) end n_tup_newpage_upd,
case when d.policytype = 'r' then (sum(n_live_tup)/d.numsegments)::bigint else sum(n_live_tup) end n_live_tup,
case when d.policytype = 'r' then (sum(n_dead_tup)/d.numsegments)::bigint else sum(n_dead_tup) end n_dead_tup,
case when d.policytype = 'r' then (sum(n_mod_since_analyze)/d.numsegments)::bigint else sum(n_mod_since_analyze) end n_mod_since_analyze,
case when d.policytype = 'r' then (sum(n_ins_since_vacuum)/d.numsegments)::bigint else sum(n_ins_since_vacuum) end n_ins_since_vacuum,
max(last_vacuum) as last_vacuum,
max(last_autovacuum) as last_autovacuum,
max(last_analyze) as last_analyze,
max(last_autoanalyze) as last_autoanalyze,
max(vacuum_count) as vacuum_count,
max(autovacuum_count) as autovacuum_count,
max(analyze_count) as analyze_count,
max(autoanalyze_count) as autoanalyze_count
FROM
gp_dist_random('pg_stat_all_tables') allt
inner join pg_class c
on allt.relid = c.oid
left outer join gp_distribution_policy d
on allt.relid = d.localoid
WHERE
relid >= 16384
and (
d.localoid is not null
or c.relkind in ('o', 'b', 'M')
)
GROUP BY allt.relid, allt.schemaname, allt.relname, d.policytype, d.numsegments
UNION ALL
SELECT
*
FROM
pg_stat_all_tables
WHERE
relid < 16384) m, pg_stat_all_tables s
WHERE m.relid = s.relid;
CREATE VIEW gp_stat_user_tables_summary AS
SELECT * FROM gp_stat_all_tables_summary
WHERE schemaname NOT IN ('pg_catalog', 'information_schema', 'pg_aoseg') AND
schemaname !~ '^pg_toast';
CREATE VIEW gp_stat_sys_tables_summary AS
SELECT * FROM gp_stat_all_tables_summary
WHERE schemaname IN ('pg_catalog', 'information_schema', 'pg_aoseg') OR
schemaname ~ '^pg_toast';
CREATE VIEW gp_stat_xact_all_tables_summary AS
SELECT
sxa.relid,
sxa.schemaname,
sxa.relname,
CASE WHEN dst.policytype = 'r' THEN (sum(sxa.seq_scan)/dst.numsegments)::bigint ELSE sum(sxa.seq_scan) END AS seq_scan,
CASE WHEN dst.policytype = 'r' THEN (sum(sxa.seq_tup_read)/dst.numsegments)::bigint ELSE sum(sxa.seq_tup_read) END AS seq_tup_read,
CASE WHEN dst.policytype = 'r' THEN (sum(sxa.idx_scan)/dst.numsegments)::bigint ELSE sum(sxa.idx_scan) END AS idx_scan,
CASE WHEN dst.policytype = 'r' THEN (sum(sxa.idx_tup_fetch)/dst.numsegments)::bigint ELSE sum(sxa.idx_tup_fetch) END AS idx_tup_fetch,
CASE WHEN dst.policytype = 'r' THEN (sum(sxa.n_tup_ins)/dst.numsegments)::bigint ELSE sum(sxa.n_tup_ins) END AS n_tup_ins,
CASE WHEN dst.policytype = 'r' THEN (sum(sxa.n_tup_upd)/dst.numsegments)::bigint ELSE sum(sxa.n_tup_upd) END AS n_tup_upd,
CASE WHEN dst.policytype = 'r' THEN (sum(sxa.n_tup_del)/dst.numsegments)::bigint ELSE sum(sxa.n_tup_del) END AS n_tup_del,
CASE WHEN dst.policytype = 'r' THEN (sum(sxa.n_tup_hot_upd)/dst.numsegments)::bigint ELSE sum(sxa.n_tup_hot_upd) END AS n_tup_hot_upd,
CASE WHEN dst.policytype = 'r' THEN (sum(sxa.n_tup_newpage_upd)/dst.numsegments)::bigint ELSE sum(sxa.n_tup_newpage_upd) END AS n_tup_newpage_upd
FROM
gp_stat_xact_all_tables sxa
LEFT OUTER JOIN gp_distribution_policy dst
ON sxa.relid = dst.localoid
GROUP BY
sxa.relid,
sxa.schemaname,
sxa.relname,
dst.policytype,
dst.numsegments;
CREATE VIEW gp_stat_xact_sys_tables_summary as
SELECT * FROM gp_stat_xact_all_tables_summary
WHERE schemaname IN ('pg_catalog', 'information_schema', 'pg_aoseg') OR
schemaname ~ '^pg_toast';
CREATE VIEW gp_stat_xact_user_tables_summary AS
SELECT * FROM gp_stat_xact_all_tables_summary
WHERE schemaname NOT IN ('pg_catalog', 'information_schema', 'pg_aoseg') AND
schemaname !~ '^pg_toast';
-- Gather data from segments on user tables, and use data on coordinator on system tables.
CREATE VIEW gp_stat_all_indexes_summary AS
SELECT
s.relid,
s.indexrelid,
s.schemaname,
s.relname,
s.indexrelname,
m.idx_scan,
m.last_idx_scan,
m.idx_tup_read,
m.idx_tup_fetch
FROM
(SELECT
alli.relid,
alli.indexrelid,
alli.schemaname,
alli.relname,
alli.indexrelname,
case when d.policytype = 'r' then (sum(alli.idx_scan)/d.numsegments)::bigint else sum(alli.idx_scan) end idx_scan,
max(last_idx_scan) as last_idx_scan,
case when d.policytype = 'r' then (sum(alli.idx_tup_read)/d.numsegments)::bigint else sum(alli.idx_tup_read) end idx_tup_read,
case when d.policytype = 'r' then (sum(alli.idx_tup_fetch)/d.numsegments)::bigint else sum(alli.idx_tup_fetch) end idx_tup_fetch
FROM
gp_dist_random('pg_stat_all_indexes') alli
inner join pg_class c
on alli.relid = c.oid
left outer join gp_distribution_policy d
on alli.relid = d.localoid
WHERE
relid >= 16384
GROUP BY alli.relid, alli.indexrelid, alli.schemaname, alli.relname, alli.indexrelname, d.policytype, d.numsegments
UNION ALL
SELECT
*
FROM
pg_stat_all_indexes
WHERE
relid < 16384) m, pg_stat_all_indexes s
WHERE m.relid = s.relid;
CREATE VIEW gp_stat_sys_indexes_summary AS
SELECT * FROM gp_stat_all_indexes_summary
WHERE schemaname IN ('pg_catalog', 'information_schema', 'pg_aoseg') OR
schemaname ~ '^pg_toast';
CREATE VIEW gp_stat_user_indexes_summary AS
SELECT * FROM gp_stat_all_indexes_summary
WHERE schemaname NOT IN ('pg_catalog', 'information_schema', 'pg_aoseg') AND
schemaname !~ '^pg_toast';
CREATE VIEW gp_statio_all_tables_summary as
SELECT
sat.relid,
sat.schemaname,
sat.relname,
CASE WHEN dst.policytype = 'r' THEN (sum(sat.heap_blks_read)/dst.numsegments)::bigint ELSE sum(sat.heap_blks_read) END AS heap_blks_read,
CASE WHEN dst.policytype = 'r' THEN (sum(sat.heap_blks_hit)/dst.numsegments)::bigint ELSE sum(sat.heap_blks_hit) END AS heap_blks_hit,
CASE WHEN dst.policytype = 'r' THEN (sum(sat.idx_blks_read)/dst.numsegments)::bigint ELSE sum(sat.idx_blks_read) END AS idx_blks_read,
CASE WHEN dst.policytype = 'r' THEN (sum(sat.idx_blks_hit)/dst.numsegments)::bigint ELSE sum(sat.idx_blks_hit) END AS idx_blks_hit,
CASE WHEN dst.policytype = 'r' THEN (sum(sat.toast_blks_read)/dst.numsegments)::bigint ELSE sum(sat.toast_blks_read) END AS toast_blks_read,
CASE WHEN dst.policytype = 'r' THEN (sum(sat.toast_blks_hit)/dst.numsegments)::bigint ELSE sum(sat.toast_blks_hit) END AS toast_blks_hit,
CASE WHEN dst.policytype = 'r' THEN (sum(sat.tidx_blks_read)/dst.numsegments)::bigint ELSE sum(sat.tidx_blks_read) END AS tidx_blks_read,
CASE WHEN dst.policytype = 'r' THEN (sum(sat.tidx_blks_hit)/dst.numsegments)::bigint ELSE sum(sat.tidx_blks_hit) END AS tidx_blks_hit
FROM
gp_statio_all_tables sat
LEFT OUTER JOIN gp_distribution_policy dst
ON sat.relid = dst.localoid
GROUP BY
sat.relid,
sat.schemaname,
sat.relname,
dst.policytype,
dst.numsegments;
CREATE VIEW gp_statio_sys_tables_summary AS
SELECT * FROM gp_statio_all_tables_summary
WHERE schemaname IN ('pg_catalog', 'information_schema', 'pg_aoseg') OR
schemaname ~ '^pg_toast';
CREATE VIEW gp_statio_user_tables_summary AS
SELECT * FROM gp_stat_all_tables_summary
WHERE schemaname NOT IN ('pg_catalog', 'information_schema', 'pg_aoseg') AND
schemaname !~ '^pg_toast';
CREATE VIEW gp_statio_all_sequences_summary as
SELECT
sas.relid,
sas.schemaname,
sas.relname,
CASE WHEN dst.policytype = 'r' THEN (sum(sas.blks_read)/dst.numsegments)::bigint ELSE sum(sas.blks_read) END AS blks_read,
CASE WHEN dst.policytype = 'r' THEN (sum(sas.blks_hit)/dst.numsegments)::bigint ELSE sum(sas.blks_hit) END AS blks_hit
FROM
gp_statio_all_sequences sas
LEFT OUTER JOIN gp_distribution_policy dst
ON sas.relid = dst.localoid
GROUP BY
sas.relid,
sas.schemaname,
sas.relname,
dst.policytype,
dst.numsegments;
CREATE VIEW gp_statio_sys_sequences_summary AS
SELECT * FROM gp_statio_all_sequences_summary
WHERE schemaname IN ('pg_catalog', 'information_schema', 'pg_aoseg') OR
schemaname ~ '^pg_toast';
CREATE VIEW gp_statio_user_sequences_summary AS
SELECT * FROM gp_statio_all_sequences_summary
WHERE schemaname NOT IN ('pg_catalog', 'information_schema', 'pg_aoseg') AND
schemaname !~ '^pg_toast';
CREATE VIEW gp_statio_all_indexes_summary AS
SELECT
sai.relid,
sai.indexrelid,
sai.schemaname,
sai.relname,
sai.indexrelname,
CASE WHEN dst.policytype = 'r' THEN (sum(sai.idx_blks_read)/dst.numsegments)::bigint ELSE sum(sai.idx_blks_read) END AS idx_blks_read,
CASE WHEN dst.policytype = 'r' THEN (sum(sai.idx_blks_hit)/dst.numsegments)::bigint ELSE sum(sai.idx_blks_hit) END AS idx_blks_hit
FROM
gp_statio_all_indexes sai
LEFT OUTER JOIN gp_distribution_policy dst
ON sai.relid = dst.localoid
GROUP BY
sai.relid,
sai.indexrelid,
sai.schemaname,
sai.relname,
sai.indexrelname,
dst.policytype,
dst.numsegments;
CREATE VIEW gp_statio_sys_indexes_summary AS
SELECT * FROM gp_statio_all_indexes_summary
WHERE schemaname IN ('pg_catalog', 'information_schema', 'pg_aoseg') OR
schemaname ~ '^pg_toast';
CREATE VIEW gp_statio_user_indexes_summary AS
SELECT * FROM gp_statio_all_indexes_summary
WHERE schemaname NOT IN ('pg_catalog', 'information_schema', 'pg_aoseg') AND
schemaname !~ '^pg_toast';
CREATE VIEW gp_stat_user_functions_summary AS
SELECT
guf.funcid,
guf.schemaname,
guf.funcname,
sum(guf.calls) AS calls,
sum(guf.total_time) AS total_time,
sum(guf.self_time) AS self_time
FROM
gp_stat_user_functions guf
GROUP BY
guf.funcid,
guf.schemaname,
guf.funcname;
CREATE VIEW gp_stat_xact_user_functions_summary AS
SELECT
xuf.funcid,
xuf.schemaname,
xuf.funcname,
sum(xuf.calls) AS calls,
sum(xuf.total_time) AS total_time,
sum(xuf.self_time) AS self_time
FROM
gp_stat_xact_user_functions xuf
GROUP BY
xuf.funcid,
xuf.schemaname,
xuf.funcname;
CREATE VIEW gp_stat_slru_summary AS
SELECT
gss.name,
sum(gss.blks_zeroed) AS blks_zeroed,
sum(gss.blks_hit) AS blks_hit,
sum(gss.blks_read) AS blks_read,
sum(gss.blks_written) AS blks_written,
sum(gss.blks_exists) AS blks_exists,
sum(gss.flushes) AS flushes,
sum(gss.truncates) AS truncates,
max(gss.stats_reset) AS stats_reset
FROM
gp_stat_slru gss
GROUP BY
gss.name;
CREATE VIEW gp_stat_progress_vacuum_summary AS
SELECT
max(coalesce(a1.pid, 0)) as pid,
a.datid,
a.datname,
a.relid,
a.phase,
case when d.policytype = 'r' then (sum(a.heap_blks_total)/d.numsegments)::bigint else sum(a.heap_blks_total) end heap_blks_total,
case when d.policytype = 'r' then (sum(a.heap_blks_scanned)/d.numsegments)::bigint else sum(a.heap_blks_scanned) end heap_blks_scanned,
case when d.policytype = 'r' then (sum(a.heap_blks_vacuumed)/d.numsegments)::bigint else sum(a.heap_blks_vacuumed) end heap_blks_vacuumed,
case when d.policytype = 'r' then (sum(a.index_vacuum_count)/d.numsegments)::bigint else sum(a.index_vacuum_count) end index_vacuum_count,
case when d.policytype = 'r' then (sum(a.max_dead_tuples)/d.numsegments)::bigint else sum(a.max_dead_tuples) end max_dead_tuples,
case when d.policytype = 'r' then (sum(a.num_dead_tuples)/d.numsegments)::bigint else sum(a.num_dead_tuples) end num_dead_tuples
FROM gp_stat_progress_vacuum a
JOIN pg_class c ON a.relid = c.oid
LEFT JOIN gp_distribution_policy d ON c.oid = d.localoid
LEFT JOIN gp_stat_progress_vacuum a1 ON a.pid = a1.pid AND a1.gp_segment_id = -1
WHERE a.gp_segment_id > -1
GROUP BY a.datid, a.datname, a.relid, a.phase, d.policytype, d.numsegments;
CREATE OR REPLACE VIEW gp_stat_progress_analyze_summary AS
SELECT
max(coalesce(a1.pid, 0)) as pid,
a.datid,
a.datname,
a.relid,
a.phase,
case when d.policytype = 'r' then (sum(a.sample_blks_total)/d.numsegments)::bigint else sum(a.sample_blks_total) end sample_blks_total,
case when d.policytype = 'r' then (sum(a.sample_blks_scanned)/d.numsegments)::bigint else sum(a.sample_blks_scanned) end sample_blks_scanned,
case when d.policytype = 'r' then (sum(a.ext_stats_total)/d.numsegments)::bigint else sum(a.ext_stats_total) end ext_stats_total,
case when d.policytype = 'r' then (sum(a.ext_stats_computed)/d.numsegments)::bigint else sum(a.ext_stats_computed) end ext_stats_computed,
case when d.policytype = 'r' then (sum(a.child_tables_total)/d.numsegments)::bigint else sum(a.child_tables_total) end child_tables_total,
case when d.policytype = 'r' then (sum(a.child_tables_done)/d.numsegments)::bigint else sum(a.child_tables_done) end child_tables_done
FROM gp_stat_progress_analyze a
JOIN pg_class c ON a.relid = c.oid
LEFT JOIN gp_distribution_policy d ON c.oid = d.localoid
LEFT JOIN gp_stat_progress_analyze a1 ON a.pid = a1.pid AND a1.gp_segment_id = -1
WHERE a.gp_segment_id > -1
GROUP BY a.datid, a.datname, a.relid, a.phase, d.policytype, d.numsegments;
CREATE OR REPLACE VIEW gp_stat_progress_cluster_summary AS
SELECT
max(coalesce(a1.pid, 0)) as pid,
a.datid,
a.datname,
a.relid,
a.command,
a.phase,
a.cluster_index_relid,
case when d.policytype = 'r' then (sum(a.heap_tuples_scanned)/d.numsegments)::bigint else sum(a.heap_tuples_scanned) end heap_tuples_scanned,
case when d.policytype = 'r' then (sum(a.heap_tuples_written)/d.numsegments)::bigint else sum(a.heap_tuples_written) end heap_tuples_written,
case when d.policytype = 'r' then (sum(a.heap_blks_total)/d.numsegments)::bigint else sum(a.heap_blks_total) end heap_blks_total,
case when d.policytype = 'r' then (sum(a.heap_blks_scanned)/d.numsegments)::bigint else sum(a.heap_blks_scanned) end heap_blks_scanned,
case when d.policytype = 'r' then (sum(a.index_rebuild_count)/d.numsegments)::bigint else sum(a.index_rebuild_count) end index_rebuild_count
FROM gp_stat_progress_cluster a
JOIN pg_class c ON a.relid = c.oid
LEFT JOIN gp_distribution_policy d ON c.oid = d.localoid
LEFT JOIN gp_stat_progress_cluster a1 ON a.pid = a1.pid AND a1.gp_segment_id = -1
WHERE a.gp_segment_id > -1
GROUP BY a.datid, a.datname, a.relid, a.command, a.phase, a.cluster_index_relid, d.policytype, d.numsegments;
CREATE OR REPLACE VIEW gp_stat_progress_create_index_summary AS
SELECT
max(coalesce(a1.pid, 0)) as pid,
a.datid,
a.datname,
a.relid,
a.index_relid,
a.command,
a.phase,
case when d.policytype = 'r' then (sum(a.lockers_total)/d.numsegments)::bigint else sum(a.lockers_total) end lockers_total,
case when d.policytype = 'r' then (sum(a.lockers_done)/d.numsegments)::bigint else sum(a.lockers_done) end lockers_done,
max(a.current_locker_pid) as current_locker_pid,
case when d.policytype = 'r' then (sum(a.blocks_total)/d.numsegments)::bigint else sum(a.blocks_total) end blocks_total,
case when d.policytype = 'r' then (sum(a.blocks_done)/d.numsegments)::bigint else sum(a.blocks_done) end blocks_done,
case when d.policytype = 'r' then (sum(a.tuples_total)/d.numsegments)::bigint else sum(a.tuples_total) end tuples_total,
case when d.policytype = 'r' then (sum(a.tuples_done)/d.numsegments)::bigint else sum(a.tuples_done) end tuples_done,
case when d.policytype = 'r' then (sum(a.partitions_total)/d.numsegments)::bigint else sum(a.partitions_total) end partitions_total,
case when d.policytype = 'r' then (sum(a.partitions_done)/d.numsegments)::bigint else sum(a.partitions_done) end partitions_done
FROM gp_stat_progress_create_index a
JOIN pg_class c ON a.relid = c.oid
LEFT JOIN gp_distribution_policy d ON c.oid = d.localoid
LEFT JOIN gp_stat_progress_create_index a1 ON a.pid = a1.pid AND a1.gp_segment_id = -1
WHERE a.gp_segment_id > -1
GROUP BY a.datid, a.datname, a.relid, a.index_relid, a.command, a.phase, d.policytype, d.numsegments;
CREATE OR REPLACE VIEW gp_stat_io_summary AS
SELECT
backend_type,
object,
context,
sum(reads) as reads,
sum(read_time) as read_time,
sum(writes) as writes,
sum(write_time) as write_time,
sum(writebacks) as writebacks,
sum(writeback_time) as writeback_time,
sum(extends) as extends,
sum(extend_time) as extend_time,
sum(op_bytes) as op_bytes,
sum(hits) as hits,
sum(evictions) as evictions,
sum(reuses) as reuses,
sum(fsyncs) as fsyncs,
sum(fsync_time) as fsync_time,
max(stats_reset) as stats_reset
FROM gp_stat_io
GROUP BY backend_type, object, context;