From eeb13a02baa5db60b997454af8f059a6381f42da Mon Sep 17 00:00:00 2001 From: Quentin Machu Date: Tue, 6 Dec 2016 14:18:04 +0100 Subject: [PATCH] pgsql/migrations: add index on Vulnerability_Notification.deleted_at `searchNotificationAvailable` never effectively use any indexes because: - `notified_at < $1`, where $1 is a recent timestamp, returns the majority of the table and therefore it is cheaper for PostgreSQL to use a sequential scan on the table. - there is no index for `deleted_at IS NULL`. However, when Clair has been running for long enough, the grand majority of rows (99%+) are expected to have a non-NULL `deleted_at` field. This commit adds a new index on this very field in order to fetch the remaining 1% in the blink of an eye. In other words, instead of realizing a full table scan for each `searchNotificationAvailable` query, we'll use the small branch of a new index, reducing the total cost from over 30k to a mere 150 on a Clair database that has already managed more than 1 000 000 notifications. --- ...00004_add_index_notification_deleted_at.go | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 database/pgsql/migrations/00004_add_index_notification_deleted_at.go diff --git a/database/pgsql/migrations/00004_add_index_notification_deleted_at.go b/database/pgsql/migrations/00004_add_index_notification_deleted_at.go new file mode 100644 index 00000000..12f38ab2 --- /dev/null +++ b/database/pgsql/migrations/00004_add_index_notification_deleted_at.go @@ -0,0 +1,29 @@ +// Copyright 2016 clair authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package migrations + +import "github.com/remind101/migrate" + +func init() { + RegisterMigration(migrate.Migration{ + ID: 4, + Up: migrate.Queries([]string{ + `CREATE INDEX vulnerability_notification_deleted_at_idx ON Vulnerability_Notification (deleted_at);`, + }), + Down: migrate.Queries([]string{ + `DROP INDEX vulnerability_notification_deleted_at_idx;`, + }), + }) +}