From 935b9689b7f6d27ec3e144a11a4cac47636e4f09 Mon Sep 17 00:00:00 2001 From: Matthew Staebler Date: Wed, 17 Jun 2026 17:34:23 -0400 Subject: [PATCH] Replace failed-tests matviews with direct partitioned query MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The prow_job_failed_tests_by_day and prow_job_failed_tests_by_hour materialized views scanned all ~3,500 partitions of prow_job_run_tests with no time or release filter, taking ~3 minutes per refresh. A direct query with partition pruning keys (prow_job_run_release and prow_job_run_timestamp BETWEEN start AND end) runs in ~13ms — faster than reading the matview itself (46ms) — making the matviews unnecessary overhead. Co-Authored-By: Claude Opus 4.6 --- pkg/api/job_analysis.go | 16 +++++---- pkg/db/views.go | 27 -------------- pkg/flags/postgres_benchmarking_test.go | 48 ------------------------- 3 files changed, 10 insertions(+), 81 deletions(-) diff --git a/pkg/api/job_analysis.go b/pkg/api/job_analysis.go index 9176e8705..0dd1a7cdd 100644 --- a/pkg/api/job_analysis.go +++ b/pkg/api/job_analysis.go @@ -109,14 +109,18 @@ func PrintJobAnalysisJSONFromDB( } tr := make([]testResult, 0) - jr := dbc.DB.Table("prow_job_failed_tests_by_day_matview") - if period == PeriodHour { - jr = dbc.DB.Table("prow_job_failed_tests_by_hour_matview") + if err := dbc.DB.Table("prow_job_run_tests pjrt"). + Select("date_trunc(?, pjrt.prow_job_run_timestamp) AS period, tests.name AS test_name, count(tests.name) AS count", period). + Joins("JOIN tests ON pjrt.test_id = tests.id"). + Where("pjrt.status = ?", v1sippyprocessing.TestStatusFailure). + Where("pjrt.prow_job_id IN ?", jobs). + Where("pjrt.prow_job_run_release = ?", release). + Where("pjrt.prow_job_run_timestamp BETWEEN ? AND ?", start, end). + Group("tests.name, period, pjrt.prow_job_id"). + Scan(&tr).Error; err != nil { + return results, err } - jr.Select("period, test_name, count"). - Where("prow_job_id IN ?", jobs).Scan(&tr) - for _, t := range tr { dateKey := t.Period.UTC().Format(formatter) if _, ok := results.ByPeriod[dateKey]; ok { diff --git a/pkg/db/views.go b/pkg/db/views.go index 43e3de881..8cffa1b88 100644 --- a/pkg/db/views.go +++ b/pkg/db/views.go @@ -40,22 +40,6 @@ var PostgresMatViews = []PostgresView{ Definition: jobRunsReportMatView, IndexColumns: []string{"id"}, }, - { - Name: "prow_job_failed_tests_by_day_matview", - Definition: prowJobFailedTestsMatView, - IndexColumns: []string{"period", "prow_job_id", "test_name"}, - ReplaceStrings: map[string]string{ - "|||BY|||": "day", - }, - }, - { - Name: "prow_job_failed_tests_by_hour_matview", - Definition: prowJobFailedTestsMatView, - IndexColumns: []string{"period", "prow_job_id", "test_name"}, - ReplaceStrings: map[string]string{ - "|||BY|||": "hour", - }, - }, { Name: "prow_test_report_7d_collapsed_matview", Definition: testReportCollapsedMatView, @@ -421,17 +405,6 @@ GROUP BY tests.name, tests.id, date(prow_job_run_tests.prow_job_run_timestamp), prow_job_run_tests.prow_job_run_release, prow_jobs.name ` -const prowJobFailedTestsMatView = ` -SELECT date_trunc('|||BY|||'::text, pjrt.prow_job_run_timestamp) AS period, - pjrt.prow_job_id, - tests.name AS test_name, - count(tests.name) AS count -FROM prow_job_run_tests pjrt - JOIN tests tests ON pjrt.test_id = tests.id -WHERE pjrt.status = 12 -GROUP BY tests.name, (date_trunc('|||BY|||'::text, pjrt.prow_job_run_timestamp)), pjrt.prow_job_id -` - // TODO: remove distinct once bug fixed re dupes in release_job_runs const payloadTestFailuresMatView = ` SELECT DISTINCT diff --git a/pkg/flags/postgres_benchmarking_test.go b/pkg/flags/postgres_benchmarking_test.go index f4851205b..4d8c918f4 100644 --- a/pkg/flags/postgres_benchmarking_test.go +++ b/pkg/flags/postgres_benchmarking_test.go @@ -730,54 +730,6 @@ func getMatviewBenchmarkCases(asOf time.Time) []benchmarkCase { return err }, }, - { - name: "MatviewFailedTestsByDay", - fn: func(dbc *db.DB) error { - var prowJob models.ProwJob - if err := dbc.DB.Where("name = ? AND release = ?", benchmarkJobName, benchmarkRelease).First(&prowJob).Error; err != nil { - return err - } - type testResult struct { - Period time.Time - TestName string - Count int - } - var results []testResult - res := dbc.DB.Table("prow_job_failed_tests_by_day_matview"). - Select("period, test_name, count"). - Where("prow_job_id = ?", prowJob.ID). - Scan(&results) - if res.Error != nil { - return res.Error - } - log.Printf("MatviewFailedTestsByDay: %d results for job %s", len(results), benchmarkJobName) - return nil - }, - }, - { - name: "MatviewFailedTestsByHour", - fn: func(dbc *db.DB) error { - var prowJob models.ProwJob - if err := dbc.DB.Where("name = ? AND release = ?", benchmarkJobName, benchmarkRelease).First(&prowJob).Error; err != nil { - return err - } - type testResult struct { - Period time.Time - TestName string - Count int - } - var results []testResult - res := dbc.DB.Table("prow_job_failed_tests_by_hour_matview"). - Select("period, test_name, count"). - Where("prow_job_id = ?", prowJob.ID). - Scan(&results) - if res.Error != nil { - return res.Error - } - log.Printf("MatviewFailedTestsByHour: %d results for job %s", len(results), benchmarkJobName) - return nil - }, - }, { name: "MatviewPayloadTestFailures", fn: func(dbc *db.DB) error {