Skip to content

Commit 6c0b6f3

Browse files
authored
Add pg indexes to help with org delete (#6780)
1 parent 7a65274 commit 6c0b6f3

File tree

3 files changed

+157
-0
lines changed

3 files changed

+157
-0
lines changed

.changeset/fluffy-rice-build.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'hive': patch
3+
---
4+
5+
Add pg indexes to help with org delete
Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
import { type MigrationExecutor } from '../pg-migrator';
2+
3+
/**
4+
* This migration adds a bunch of indices for columns that have cascade triggers.
5+
* Adding these significantly improves the delete performance.
6+
*/
7+
export default {
8+
name: '2025.05.14T00-00-00.cascade-deletion-indices-2.ts',
9+
noTransaction: true,
10+
run: ({ sql }) => [
11+
{
12+
name: 'index schema_versions_action_id',
13+
query: sql`
14+
CREATE INDEX CONCURRENTLY IF NOT EXISTS "schema_versions_action_id" ON "schema_versions"("action_id")
15+
`,
16+
},
17+
// For cascading delete from "schema_log"
18+
{
19+
name: 'index versions_commit_id',
20+
query: sql`
21+
CREATE INDEX CONCURRENTLY IF NOT EXISTS "versions_commit_id" ON "versions"("commit_id")
22+
`,
23+
},
24+
// For cascading delete from "targets"
25+
{
26+
name: 'index versions_target_id',
27+
query: sql`
28+
CREATE INDEX CONCURRENTLY IF NOT EXISTS "versions_target_id" ON "versions"("target_id")
29+
`,
30+
},
31+
// For cascading delete from "organizations"
32+
{
33+
name: 'index tokens_organization_id',
34+
query: sql`
35+
CREATE INDEX CONCURRENTLY IF NOT EXISTS "tokens_organization_id" ON "tokens"("organization_id")
36+
`,
37+
},
38+
// For cascading delete from "projects"
39+
{
40+
name: 'index tokens_project_id',
41+
query: sql`
42+
CREATE INDEX CONCURRENTLY IF NOT EXISTS "tokens_project_id" ON "tokens"("project_id")
43+
`,
44+
},
45+
// For cascading delete from "targets"
46+
{
47+
name: 'index tokens_target_id',
48+
query: sql`
49+
CREATE INDEX CONCURRENTLY IF NOT EXISTS "tokens_target_id" ON "tokens"("target_id")
50+
`,
51+
},
52+
// For cascading delete from "targets"
53+
{
54+
name: 'index target_validation_destination_target_id',
55+
query: sql`
56+
CREATE INDEX CONCURRENTLY IF NOT EXISTS "target_validation_destination_target_id" ON "target_validation"("destination_target_id")
57+
`,
58+
},
59+
// For cascading delete from "schema_versions"
60+
{
61+
name: 'index schema_coordinate_status_created_in_version_id',
62+
query: sql`
63+
CREATE INDEX CONCURRENTLY IF NOT EXISTS "schema_coordinate_status_created_in_version_id" ON "schema_coordinate_status"("created_in_version_id")
64+
`,
65+
},
66+
// For cascading delete from "schema_versions"
67+
{
68+
name: 'index schema_coordinate_status_deprecated_in_version_id',
69+
query: sql`
70+
CREATE INDEX CONCURRENTLY IF NOT EXISTS "schema_coordinate_status_deprecated_in_version_id" ON "schema_coordinate_status"("deprecated_in_version_id")
71+
`,
72+
},
73+
// For cascading set NULL from "users"
74+
{
75+
name: 'index document_preflight_scripts_created_by_user_id',
76+
query: sql`
77+
CREATE INDEX CONCURRENTLY IF NOT EXISTS "document_preflight_scripts_created_by_user_id" ON "document_preflight_scripts"("created_by_user_id") WHERE "created_by_user_id" IS NOT NULL
78+
`,
79+
},
80+
// For cascading set NULL from "users"
81+
{
82+
name: 'index document_collections_created_by_user_id',
83+
query: sql`
84+
CREATE INDEX CONCURRENTLY IF NOT EXISTS "document_collections_created_by_user_id" ON "document_collections"("created_by_user_id") WHERE "created_by_user_id" IS NOT NULL
85+
`,
86+
},
87+
// For cascading delete from "contract_versions"
88+
{
89+
name: 'index contract_version_changes_contract_version_id',
90+
query: sql`
91+
CREATE INDEX CONCURRENTLY IF NOT EXISTS "contract_version_changes_contract_version_id" ON "contract_version_changes"("contract_version_id")
92+
`,
93+
},
94+
// For cascading delete from "contract_versions"
95+
{
96+
name: 'index contract_checks_compared_contract_version_id',
97+
query: sql`
98+
CREATE INDEX CONCURRENTLY IF NOT EXISTS "contract_checks_compared_contract_version_id" ON "contract_checks"("compared_contract_version_id")
99+
`,
100+
},
101+
// For cascading delete from "contracts"
102+
{
103+
name: 'index contracts_contract_id',
104+
query: sql`
105+
CREATE INDEX CONCURRENTLY IF NOT EXISTS "contracts_contract_id" ON "contract_checks"("contract_id")
106+
`,
107+
},
108+
// For cascading delete from "targets"
109+
{
110+
name: 'index alerts_target_id',
111+
query: sql`
112+
CREATE INDEX CONCURRENTLY IF NOT EXISTS "alerts_target_id" ON "alerts"("target_id")
113+
`,
114+
},
115+
// For cascading delete from "projects"
116+
{
117+
name: 'index alerts_project_id',
118+
query: sql`
119+
CREATE INDEX CONCURRENTLY IF NOT EXISTS "alerts_project_id" ON "alerts"("project_id")
120+
`,
121+
},
122+
// For cascading delete from "alert_channels"
123+
{
124+
name: 'index alerts_alert_channel_id',
125+
query: sql`
126+
CREATE INDEX CONCURRENTLY IF NOT EXISTS "alerts_alert_channel_id" ON "alerts"("alert_channel_id")
127+
`,
128+
},
129+
// For cascading delete from "organizations"
130+
{
131+
name: 'index tokens_organization_id',
132+
query: sql`
133+
CREATE INDEX CONCURRENTLY IF NOT EXISTS "tokens_organization_id" ON "tokens"("organization_id")
134+
`,
135+
},
136+
// For cascading delete from "projects"
137+
{
138+
name: 'index tokens_project_id',
139+
query: sql`
140+
CREATE INDEX CONCURRENTLY IF NOT EXISTS "tokens_project_id" ON "tokens"("project_id")
141+
`,
142+
},
143+
// For cascading delete from "targets"
144+
{
145+
name: 'index tokens_target_id',
146+
query: sql`
147+
CREATE INDEX CONCURRENTLY IF NOT EXISTS "tokens_target_id" ON "tokens"("target_id")
148+
`,
149+
},
150+
],
151+
} satisfies MigrationExecutor;

packages/migrations/src/run-pg-migrations.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,5 +162,6 @@ export const runPGMigrations = async (args: { slonik: DatabasePool; runTo?: stri
162162
await import('./actions/2025.02.14T00-00-00.schema-versions-metadata'),
163163
await import('./actions/2025.02.21T00-00-00.schema-versions-metadata-attributes'),
164164
await import('./actions/2025.03.20T00-00-00.dangerous_breaking'),
165+
await import('./actions/2025.05.14T00-00-00.cascade-deletion-indices-2'),
165166
],
166167
});

0 commit comments

Comments
 (0)