Browse Source

feat(workflow): Adding indices on GroupRelease for group_id, and first_seen / last_seen DESC (#25729)

Chris Fuller 3 years ago
parent
commit
0eacb01338

+ 1 - 1
migrations_lockfile.txt

@@ -7,5 +7,5 @@ will then be regenerated, and you should be able to merge without conflicts.
 
 jira_ac: 0001_initial
 nodestore: 0002_nodestore_no_dictfield
-sentry: 0192_remove_fileblobowner_org_fk
+sentry: 0193_grouprelease_indexes
 social_auth: 0001_initial

+ 60 - 0
src/sentry/migrations/0193_grouprelease_indexes.py

@@ -0,0 +1,60 @@
+# Generated by Django 1.11.29 on 2021-04-26 20:15
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+    # This flag is used to mark that a migration shouldn't be automatically run in
+    # production. We set this to True for operations that we think are risky and want
+    # someone from ops to run manually and monitor.
+    # General advice is that if in doubt, mark your migration as `is_dangerous`.
+    # Some things you should always mark as dangerous:
+    # - Large data migrations. Typically we want these to be run manually by ops so that
+    #   they can be monitored. Since data migrations will now hold a transaction open
+    #   this is even more important.
+    # - Adding columns to highly active tables, even ones that are NULL.
+    is_dangerous = True
+
+    # This flag is used to decide whether to run this migration in a transaction or not.
+    # By default we prefer to run in a transaction, but for migrations where you want
+    # to `CREATE INDEX CONCURRENTLY` this needs to be set to False. Typically you'll
+    # want to create an index concurrently when adding one to an existing table.
+    # You'll also usually want to set this to `False` if you're writing a data
+    # migration, since we don't want the entire migration to run in one long-running
+    # transaction.
+    atomic = False
+
+    dependencies = [
+        ("sentry", "0192_remove_fileblobowner_org_fk"),
+    ]
+
+    operations = [
+        migrations.SeparateDatabaseAndState(
+            database_operations=[
+                migrations.RunSQL(
+                    """
+                    CREATE INDEX CONCURRENTLY IF NOT EXISTS sentry_grouprelease_group_id_first_seen_53fc35ds
+                    ON sentry_grouprelease USING btree (group_id, first_seen);
+                    """,
+                    reverse_sql="""
+                    DROP INDEX CONCURRENTLY IF EXISTS sentry_grouprelease_group_id_first_seen_53fc35ds;
+                    """,
+                ),
+                migrations.RunSQL(
+                    """
+                    CREATE INDEX CONCURRENTLY IF NOT EXISTS sentry_grouprelease_group_id_last_seen_g8v2sk7c
+                    ON sentry_grouprelease USING btree (group_id, last_seen DESC);
+                    """,
+                    reverse_sql="""
+                    DROP INDEX CONCURRENTLY IF EXISTS sentry_grouprelease_group_id_last_seen_g8v2sk7c;
+                    """,
+                ),
+            ],
+            state_operations=[
+                migrations.AlterIndexTogether(
+                    name="grouprelease",
+                    index_together={("group_id", "last_seen"), ("group_id", "first_seen")},
+                ),
+            ],
+        )
+    ]

+ 4 - 0
src/sentry/models/grouprelease.py

@@ -24,6 +24,10 @@ class GroupRelease(Model):
         app_label = "sentry"
         db_table = "sentry_grouprelease"
         unique_together = (("group_id", "release_id", "environment"),)
+        index_together = (
+            ("group_id", "first_seen"),
+            ("group_id", "last_seen"),
+        )
 
     __repr__ = sane_repr("group_id", "release_id")