diff --git a/HISTORY b/HISTORY index 9a7f0281..8a5e8471 100644 --- a/HISTORY +++ b/HISTORY @@ -34,3 +34,4 @@ 1.1.1 2011-XX-XX Add --ignore-rsync-warning (Cédric) Add strnlen for compatibility with OS X (Greg) + Improve performance of repl_status view (Jaime) diff --git a/repmgr.c b/repmgr.c index 6e899ad6..ff445257 100644 --- a/repmgr.c +++ b/repmgr.c @@ -442,14 +442,13 @@ do_master_register(void) /* and the view */ sqlquery_snprintf(sqlquery, "CREATE VIEW %s.repl_status AS " - " WITH monitor_info AS (SELECT *, ROW_NUMBER() OVER (PARTITION BY primary_node, standby_node " - " ORDER BY last_monitor_time desc) " - " FROM %s.repl_monitor) " " SELECT primary_node, standby_node, last_monitor_time, last_wal_primary_location, " " last_wal_standby_location, pg_size_pretty(replication_lag) replication_lag, " " pg_size_pretty(apply_lag) apply_lag, age(now(), last_monitor_time) AS time_lag " - " FROM monitor_info a " - " WHERE row_number = 1", repmgr_schema, repmgr_schema); + " FROM %s.repl_monitor " + " WHERE (standby_node, last_monitor_time) IN (SELECT standby_node, MAX(last_monitor_time) " + " FROM %s.repl_monitor GROUP BY 1)", + repmgr_schema, repmgr_schema, repmgr_schema); log_debug("master register: %s\n", sqlquery); if (!PQexec(conn, sqlquery)) { @@ -458,6 +457,19 @@ do_master_register(void) PQfinish(conn); exit(ERR_BAD_CONFIG); } + + /* an index to improve performance of the view */ + sqlquery_snprintf(sqlquery, "CREATE INDEX idx_repl_status_sort " + " ON %s.repl_monitor (last_monitor_time, standby_node) ", + repmgr_schema); + log_debug(_("master register: %s\n"), sqlquery); + if (!PQexec(conn, sqlquery)) + { + log_err(_("Cannot indexing table %s.repl_monitor: %s\n"), + repmgr_schema, PQerrorMessage(conn)); + PQfinish(conn); + exit(ERR_BAD_CONFIG); + } } else {