mirror of
https://github.com/coder/coder.git
synced 2025-07-18 14:17:22 +00:00
chore(coderd/database): optimize AuditLogs queries (#18600)
Closes #17689 This PR optimizes the audit logs query performance by extracting the count operation into a separate query and replacing the OR-based workspace_builds with conditional joins. ## Query changes * Extracted count query to separate one * Replaced single `workspace_builds` join with OR conditions with separate conditional joins * Added conditional joins * `wb_build` for workspace_build audit logs (which is a direct lookup) * `wb_workspace` for workspace create audit logs (via workspace) Optimized AuditLogsOffset query: https://explain.dalibo.com/plan/4g1hbedg4a564bg8 New CountAuditLogs query: https://explain.dalibo.com/plan/ga2fbcecb9efbce3
This commit is contained in:
@ -1,9 +1,12 @@
|
||||
package database
|
||||
|
||||
import (
|
||||
"regexp"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/google/go-cmp/cmp"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/coder/coder/v2/testutil"
|
||||
@ -54,3 +57,41 @@ func TestWorkspaceTableConvert(t *testing.T) {
|
||||
"'workspace.WorkspaceTable()' is not missing at least 1 field when converting to 'WorkspaceTable'. "+
|
||||
"To resolve this, go to the 'func (w Workspace) WorkspaceTable()' and ensure all fields are converted.")
|
||||
}
|
||||
|
||||
// TestAuditLogsQueryConsistency ensures that GetAuditLogsOffset and CountAuditLogs
|
||||
// have identical WHERE clauses to prevent filtering inconsistencies.
|
||||
// This test is a guard rail to prevent developer oversight mistakes.
|
||||
func TestAuditLogsQueryConsistency(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
getWhereClause := extractWhereClause(getAuditLogsOffset)
|
||||
require.NotEmpty(t, getWhereClause, "failed to extract WHERE clause from GetAuditLogsOffset")
|
||||
|
||||
countWhereClause := extractWhereClause(countAuditLogs)
|
||||
require.NotEmpty(t, countWhereClause, "failed to extract WHERE clause from CountAuditLogs")
|
||||
|
||||
// Compare the WHERE clauses
|
||||
if diff := cmp.Diff(getWhereClause, countWhereClause); diff != "" {
|
||||
t.Errorf("GetAuditLogsOffset and CountAuditLogs WHERE clauses must be identical to ensure consistent filtering.\nDiff:\n%s", diff)
|
||||
}
|
||||
}
|
||||
|
||||
// extractWhereClause extracts the WHERE clause from a SQL query string
|
||||
func extractWhereClause(query string) string {
|
||||
// Find WHERE and get everything after it
|
||||
wherePattern := regexp.MustCompile(`(?is)WHERE\s+(.*)`)
|
||||
whereMatches := wherePattern.FindStringSubmatch(query)
|
||||
if len(whereMatches) < 2 {
|
||||
return ""
|
||||
}
|
||||
|
||||
whereClause := whereMatches[1]
|
||||
|
||||
// Remove ORDER BY, LIMIT, OFFSET clauses from the end
|
||||
whereClause = regexp.MustCompile(`(?is)\s+(ORDER BY|LIMIT|OFFSET).*$`).ReplaceAllString(whereClause, "")
|
||||
|
||||
// Remove SQL comments
|
||||
whereClause = regexp.MustCompile(`(?m)--.*$`).ReplaceAllString(whereClause, "")
|
||||
|
||||
return strings.TrimSpace(whereClause)
|
||||
}
|
||||
|
Reference in New Issue
Block a user