Skip to content

Commit 949ce61

Browse files
authored
feat: add auto-ANALYZE infos in "inspect db vacuum-stats" (#4409)
2 parents 4054f20 + 2317aba commit 949ce61

File tree

3 files changed

+37
-11
lines changed

3 files changed

+37
-11
lines changed

internal/inspect/vacuum_stats/vacuum_stats.go

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,17 @@ import (
1919
var VacuumStatsQuery string
2020

2121
type Result struct {
22-
Name string
23-
Last_vacuum string
24-
Last_autovacuum string
25-
Rowcount string
26-
Dead_rowcount string
27-
Autovacuum_threshold string
28-
Expect_autovacuum string
22+
Name string
23+
Last_vacuum string
24+
Last_autovacuum string
25+
Last_analyze string
26+
Last_autoanalyze string
27+
Rowcount string
28+
Dead_rowcount string
29+
Autovacuum_threshold string
30+
Autoanalyze_threshold string
31+
Expect_autovacuum string
32+
Expect_autoanalyze string
2933
}
3034

3135
func Run(ctx context.Context, config pgconn.Config, fsys afero.Fs, options ...func(*pgx.ConnConfig)) error {
@@ -43,10 +47,10 @@ func Run(ctx context.Context, config pgconn.Config, fsys afero.Fs, options ...fu
4347
return err
4448
}
4549

46-
table := "|Table|Last Vacuum|Last Auto Vacuum|Row count|Dead row count|Expect autovacuum?\n|-|-|-|-|-|-|\n"
50+
table := "|Table|Last Vacuum|Last Auto Vacuum|Last Analyze|Last Auto Analyze|Row count|Dead row count|Expect autovacuum?|Expect autoanalyze?|\n|-|-|-|-|-|-|-|-|-|\n"
4751
for _, r := range result {
4852
rowcount := strings.Replace(r.Rowcount, "-1", "No stats", 1)
49-
table += fmt.Sprintf("|`%s`|%s|%s|`%s`|`%s`|`%s`|\n", r.Name, r.Last_vacuum, r.Last_autovacuum, rowcount, r.Dead_rowcount, r.Expect_autovacuum)
53+
table += fmt.Sprintf("|`%s`|%s|%s|%s|%s|`%s`|`%s`|`%s`|`%s`|\n", r.Name, r.Last_vacuum, r.Last_autovacuum, r.Last_analyze, r.Last_autoanalyze, rowcount, r.Dead_rowcount, r.Expect_autovacuum, r.Expect_autoanalyze)
5054
}
5155
return utils.RenderTable(table)
5256
}

internal/inspect/vacuum_stats/vacuum_stats.sql

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,26 @@ WITH table_opts AS (
1515
WHEN relopts LIKE '%autovacuum_vacuum_scale_factor%'
1616
THEN substring(relopts, '.*autovacuum_vacuum_scale_factor=([0-9.]+).*')::real
1717
ELSE current_setting('autovacuum_vacuum_scale_factor')::real
18-
END AS autovacuum_vacuum_scale_factor
18+
END AS autovacuum_vacuum_scale_factor,
19+
CASE
20+
WHEN relopts LIKE '%autovacuum_analyze_threshold%'
21+
THEN substring(relopts, '.*autovacuum_analyze_threshold=([0-9.]+).*')::integer
22+
ELSE current_setting('autovacuum_analyze_threshold')::integer
23+
END AS autovacuum_analyze_threshold,
24+
CASE
25+
WHEN relopts LIKE '%autovacuum_analyze_scale_factor%'
26+
THEN substring(relopts, '.*autovacuum_analyze_scale_factor=([0-9.]+).*')::real
27+
ELSE current_setting('autovacuum_analyze_scale_factor')::real
28+
END AS autovacuum_analyze_scale_factor
1929
FROM
2030
table_opts
2131
)
2232
SELECT
2333
FORMAT('%I.%I', vacuum_settings.nspname, vacuum_settings.relname) AS name,
2434
coalesce(to_char(psut.last_vacuum, 'YYYY-MM-DD HH24:MI'), '') AS last_vacuum,
2535
coalesce(to_char(psut.last_autovacuum, 'YYYY-MM-DD HH24:MI'), '') AS last_autovacuum,
36+
coalesce(to_char(psut.last_analyze, 'YYYY-MM-DD HH24:MI'), '') AS last_analyze,
37+
coalesce(to_char(psut.last_autoanalyze, 'YYYY-MM-DD HH24:MI'), '') AS last_autoanalyze,
2638
to_char(pg_class.reltuples, '9G999G999G999') AS rowcount,
2739
to_char(psut.n_dead_tup, '9G999G999G999') AS dead_rowcount,
2840
to_char(autovacuum_vacuum_threshold
@@ -31,7 +43,14 @@ SELECT
3143
WHEN autovacuum_vacuum_threshold + (autovacuum_vacuum_scale_factor::numeric * pg_class.reltuples) < psut.n_dead_tup
3244
THEN 'yes'
3345
ELSE 'no'
34-
END AS expect_autovacuum
46+
END AS expect_autovacuum,
47+
to_char(autovacuum_analyze_threshold
48+
+ (autovacuum_analyze_scale_factor::numeric * pg_class.reltuples), '9G999G999G999') AS autoanalyze_threshold,
49+
CASE
50+
WHEN autovacuum_analyze_threshold + (autovacuum_analyze_scale_factor::numeric * pg_class.reltuples) < psut.n_dead_tup
51+
THEN 'yes'
52+
ELSE 'no'
53+
END AS expect_autoanalyze
3554
FROM
3655
pg_stat_user_tables psut INNER JOIN pg_class ON psut.relid = pg_class.oid
3756
INNER JOIN vacuum_settings ON pg_class.oid = vacuum_settings.oid

internal/inspect/vacuum_stats/vacuum_stats_test.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,13 @@ func TestVacuumCommand(t *testing.T) {
3232
Name: "test_schema.test_table",
3333
Last_vacuum: "2021-01-01 00:00:00",
3434
Last_autovacuum: "2021-01-01 00:00:00",
35+
Last_analyze: "2021-01-01 00:00:00",
36+
Last_autoanalyze: "2021-01-01 00:00:00",
3537
Rowcount: "1000",
3638
Dead_rowcount: "100",
3739
Autovacuum_threshold: "100",
3840
Expect_autovacuum: "yes",
41+
Expect_autoanalyze: "yes",
3942
})
4043
// Run test
4144
err := Run(context.Background(), dbConfig, fsys, conn.Intercept)

0 commit comments

Comments
 (0)