Commit 79a986f7 authored by Toon Claes's avatar Toon Claes

Add indexes to all geo event foreign keys

Because the Geo Event tables do a `on_delete: :cascade`, the foreign
keys in `geo_event_log` need to have an index. Otherwise the deletion
would be very slow.

See
https://docs.gitlab.com/ee/development/migration_style_guide.html#adding-foreign-key-constraints

Closes https://gitlab.com/gitlab-org/gitlab-ee/issues/7955
parent 39717f4f
......@@ -11,7 +11,7 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20181013005024) do
ActiveRecord::Schema.define(version: 20181017131623) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
......@@ -1123,13 +1123,18 @@ ActiveRecord::Schema.define(version: 20181013005024) do
t.integer "cache_invalidation_event_id", limit: 8
end
add_index "geo_event_log", ["cache_invalidation_event_id"], name: "index_geo_event_log_on_cache_invalidation_event_id", using: :btree
add_index "geo_event_log", ["repositories_changed_event_id"], name: "index_geo_event_log_on_repositories_changed_event_id", using: :btree
add_index "geo_event_log", ["repository_created_event_id"], name: "index_geo_event_log_on_repository_created_event_id", using: :btree
add_index "geo_event_log", ["repository_deleted_event_id"], name: "index_geo_event_log_on_repository_deleted_event_id", using: :btree
add_index "geo_event_log", ["repository_renamed_event_id"], name: "index_geo_event_log_on_repository_renamed_event_id", using: :btree
add_index "geo_event_log", ["repository_updated_event_id"], name: "index_geo_event_log_on_repository_updated_event_id", using: :btree
add_index "geo_event_log", ["reset_checksum_event_id"], name: "index_geo_event_log_on_reset_checksum_event_id", using: :btree
add_index "geo_event_log", ["cache_invalidation_event_id"], name: "index_geo_event_log_on_cache_invalidation_event_id", where: "(cache_invalidation_event_id IS NOT NULL)", using: :btree
add_index "geo_event_log", ["hashed_storage_attachments_event_id"], name: "index_geo_event_log_on_hashed_storage_attachments_event_id", where: "(hashed_storage_attachments_event_id IS NOT NULL)", using: :btree
add_index "geo_event_log", ["hashed_storage_migrated_event_id"], name: "index_geo_event_log_on_hashed_storage_migrated_event_id", where: "(hashed_storage_migrated_event_id IS NOT NULL)", using: :btree
add_index "geo_event_log", ["job_artifact_deleted_event_id"], name: "index_geo_event_log_on_job_artifact_deleted_event_id", where: "(job_artifact_deleted_event_id IS NOT NULL)", using: :btree
add_index "geo_event_log", ["lfs_object_deleted_event_id"], name: "index_geo_event_log_on_lfs_object_deleted_event_id", where: "(lfs_object_deleted_event_id IS NOT NULL)", using: :btree
add_index "geo_event_log", ["repositories_changed_event_id"], name: "index_geo_event_log_on_repositories_changed_event_id", where: "(repositories_changed_event_id IS NOT NULL)", using: :btree
add_index "geo_event_log", ["repository_created_event_id"], name: "index_geo_event_log_on_repository_created_event_id", where: "(repository_created_event_id IS NOT NULL)", using: :btree
add_index "geo_event_log", ["repository_deleted_event_id"], name: "index_geo_event_log_on_repository_deleted_event_id", where: "(repository_deleted_event_id IS NOT NULL)", using: :btree
add_index "geo_event_log", ["repository_renamed_event_id"], name: "index_geo_event_log_on_repository_renamed_event_id", where: "(repository_renamed_event_id IS NOT NULL)", using: :btree
add_index "geo_event_log", ["repository_updated_event_id"], name: "index_geo_event_log_on_repository_updated_event_id", where: "(repository_updated_event_id IS NOT NULL)", using: :btree
add_index "geo_event_log", ["reset_checksum_event_id"], name: "index_geo_event_log_on_reset_checksum_event_id", where: "(reset_checksum_event_id IS NOT NULL)", using: :btree
add_index "geo_event_log", ["upload_deleted_event_id"], name: "index_geo_event_log_on_upload_deleted_event_id", where: "(upload_deleted_event_id IS NOT NULL)", using: :btree
create_table "geo_hashed_storage_attachments_events", id: :bigserial, force: :cascade do |t|
t.integer "project_id", null: false
......
---
title: Add indexes to all geo event foreign keys
merge_request: 7990
author:
type: performance
# frozen_string_literal: true
class AddMissingGeoEvenLogIndexes < ActiveRecord::Migration
include Gitlab::Database::MigrationHelpers
DOWNTIME = false
INDEXED_COLUMNS = %i[cache_invalidation_event_id
repositories_changed_event_id
repository_created_event_id
repository_deleted_event_id
repository_renamed_event_id
repository_updated_event_id
reset_checksum_event_id]
OTHER_COLUMNS = %i[hashed_storage_migrated_event_id
lfs_object_deleted_event_id
hashed_storage_attachments_event_id
job_artifact_deleted_event_id
upload_deleted_event_id]
disable_ddl_transaction!
def up
# Remove existing indexes that aren't partial
INDEXED_COLUMNS.each do |col|
remove_concurrent_index(:geo_event_log, col)
end
# Create partial indexes on all
(INDEXED_COLUMNS + OTHER_COLUMNS).each do |col|
add_concurrent_index(:geo_event_log,
col,
where: "#{col} IS NOT NULL")
end
end
def down
# Rollback all partial indexes
(INDEXED_COLUMNS + OTHER_COLUMNS).each do |col|
remove_concurrent_index(:geo_event_log, col)
end
# Recreate full indexes
INDEXED_COLUMNS.each do |col|
add_concurrent_index(:geo_event_log, col)
end
end
end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment