Commit 4a8f7065 authored by Maxim Ivanov's avatar Maxim Ivanov
Browse files

Rearrange queries so that only one unique index is required

parent 391c5353
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
CREATE UNIQUE INDEX CONCURRENTLY IF NOT EXISTS storage_collection_user_id_key_idx ON storage (collection, user_id, key);

--TODO: wait for index to complete

ALTER TABLE storage
  drop constraint storage_pkey, add primary key using index "storage_collection_key_user_id_key";
  drop constraint storage_pkey, add primary key using index "storage_collection_user_id_key_idx";

DROP INDEX storage_pkey RESTRICT;
DROP INDEX storage_collection_key_user_id_key RESTRICT;
DROP INDEX collection_read_user_id_key_idx RESTRICT;
DROP INDEX collection_user_id_read_key_idx RESTRICT;

CREATE UNIQUE INDEX CONCURRENTLY IF NOT EXISTS collection_user_id_key_idx ON storage (collection, user_id, key);
+4 −5
Original line number Diff line number Diff line
@@ -151,9 +151,8 @@ func StorageListObjectsAll(ctx context.Context, logger *zap.Logger, db *sql.DB,
	cursorQuery := ""
	params := []interface{}{collection, limit + 1}
	if storageCursor != nil {
		//TODO: check if we can reorder collection,user_id, key
		cursorQuery = ` AND (collection, key, user_id) > ($1, $3, $4) `
		params = append(params, storageCursor.Key, storageCursor.UserID)
		cursorQuery = ` AND (collection, user_id, key) > ($1, $3, $4) `
		params = append(params, storageCursor.UserID, storageCursor.Key)
	}

	var query string
@@ -162,14 +161,14 @@ func StorageListObjectsAll(ctx context.Context, logger *zap.Logger, db *sql.DB,
SELECT collection, key, user_id, value, version, read, write, create_time, update_time
FROM storage
WHERE collection = $1` + cursorQuery + `
ORDER BY key ASC, user_id ASC
ORDER BY user_id ASC, key ASC
LIMIT $2`
	} else {
		query = `
SELECT collection, key, user_id, value, version, read, write, create_time, update_time
FROM storage
WHERE collection = $1 AND read >= 2` + cursorQuery + `
ORDER BY key ASC, user_id ASC
ORDER BY user_id ASC, key ASC
LIMIT $2`
	}