summaryrefslogtreecommitdiffstats
path: root/gerrit-reviewdb/src/main/resources/com/google/gerrit/reviewdb/server/index_postgres.sql
diff options
context:
space:
mode:
Diffstat (limited to 'gerrit-reviewdb/src/main/resources/com/google/gerrit/reviewdb/server/index_postgres.sql')
-rw-r--r--gerrit-reviewdb/src/main/resources/com/google/gerrit/reviewdb/server/index_postgres.sql265
1 files changed, 265 insertions, 0 deletions
diff --git a/gerrit-reviewdb/src/main/resources/com/google/gerrit/reviewdb/server/index_postgres.sql b/gerrit-reviewdb/src/main/resources/com/google/gerrit/reviewdb/server/index_postgres.sql
new file mode 100644
index 0000000000..97ad126634
--- /dev/null
+++ b/gerrit-reviewdb/src/main/resources/com/google/gerrit/reviewdb/server/index_postgres.sql
@@ -0,0 +1,265 @@
+-- Gerrit 2 : PostgreSQL
+--
+
+-- Cluster hot tables by their primary method of access
+--
+ALTER TABLE patch_sets CLUSTER ON patch_sets_pkey;
+ALTER TABLE change_messages CLUSTER ON change_messages_pkey;
+ALTER TABLE patch_comments CLUSTER ON patch_comments_pkey;
+ALTER TABLE patch_set_approvals CLUSTER ON patch_set_approvals_pkey;
+
+ALTER TABLE account_group_members CLUSTER ON account_group_members_pkey;
+ALTER TABLE starred_changes CLUSTER ON starred_changes_pkey;
+CLUSTER;
+
+
+-- Define function for conditional installation of PL/pgSQL.
+-- This is required, because starting with PostgreSQL 9.0, PL/pgSQL
+-- language is installed by default and database returns error when
+-- we try to install it again.
+--
+-- Source: http://wiki.postgresql.org/wiki/CREATE_OR_REPLACE_LANGUAGE
+-- Author: David Fetter
+--
+
+delimiter //
+
+CREATE OR REPLACE FUNCTION make_plpgsql()
+RETURNS VOID
+LANGUAGE SQL
+AS $$
+CREATE LANGUAGE plpgsql;
+$$;
+
+//
+
+delimiter ;
+
+SELECT
+ CASE
+ WHEN EXISTS(
+ SELECT 1
+ FROM pg_catalog.pg_language
+ WHERE lanname='plpgsql'
+ )
+ THEN NULL
+ ELSE make_plpgsql() END;
+
+DROP FUNCTION make_plpgsql();
+
+-- Define our schema upgrade support function.
+--
+
+delimiter //
+
+CREATE OR REPLACE FUNCTION
+check_schema_version (exp INT)
+RETURNS VARCHAR(255)
+AS $$
+DECLARE
+ l_act INT;
+BEGIN
+ SELECT version_nbr INTO l_act
+ FROM schema_version;
+
+ IF l_act <> exp
+ THEN
+ RAISE EXCEPTION 'expected schema %, found %', exp, l_act;
+ END IF;
+ RETURN 'OK';
+END;
+$$ LANGUAGE plpgsql;
+//
+
+delimiter ;
+
+-- Indexes to support @Query
+--
+
+-- *********************************************************************
+-- AccountAccess
+-- covers: byPreferredEmail, suggestByPreferredEmail
+CREATE INDEX accounts_byPreferredEmail
+ON accounts (preferred_email);
+
+-- covers: suggestByFullName
+CREATE INDEX accounts_byFullName
+ON accounts (full_name);
+
+
+-- *********************************************************************
+-- AccountAgreementAccess
+-- @PrimaryKey covers: byAccount
+
+
+-- *********************************************************************
+-- AccountExternalIdAccess
+-- covers: byAccount
+CREATE INDEX account_external_ids_byAccount
+ON account_external_ids (account_id);
+
+-- covers: byEmailAddress, suggestByEmailAddress
+CREATE INDEX account_external_ids_byEmail
+ON account_external_ids (email_address);
+
+
+-- *********************************************************************
+-- AccountGroupAccess
+CREATE INDEX account_groups_ownedByGroup
+ON account_groups (owner_group_id);
+
+
+-- *********************************************************************
+-- AccountGroupMemberAccess
+-- @PrimaryKey covers: byAccount
+CREATE INDEX account_group_members_byGroup
+ON account_group_members (group_id);
+
+
+-- *********************************************************************
+-- AccountGroupIncludeAccess
+-- @PrimaryKey covers: byGroup
+CREATE INDEX account_group_includes_byInclude
+ON account_group_includes (include_id);
+
+
+-- *********************************************************************
+-- AccountProjectWatchAccess
+-- @PrimaryKey covers: byAccount
+-- covers: byProject
+CREATE INDEX account_project_watches_byProject
+ON account_project_watches (project_name);
+
+
+-- *********************************************************************
+-- AccountSshKeyAccess
+-- @PrimaryKey covers: byAccount, valid
+
+
+-- *********************************************************************
+-- ApprovalCategoryAccess
+-- too small to bother indexing
+
+
+-- *********************************************************************
+-- ApprovalCategoryValueAccess
+-- @PrimaryKey covers: byCategory
+
+
+-- *********************************************************************
+-- BranchAccess
+-- @PrimaryKey covers: byProject
+
+
+-- *********************************************************************
+-- ChangeAccess
+-- covers: byOwnerOpen
+CREATE INDEX changes_byOwnerOpen
+ON changes (owner_account_id, created_on, change_id)
+WHERE open = 'Y';
+
+-- covers: byOwnerClosed
+CREATE INDEX changes_byOwnerClosed
+ON changes (owner_account_id, last_updated_on)
+WHERE open = 'N';
+
+-- covers: submitted, allSubmitted
+CREATE INDEX changes_submitted
+ON changes (dest_project_name, dest_branch_name, last_updated_on)
+WHERE status = 's';
+
+-- covers: allOpenPrev, allOpenNext
+CREATE INDEX changes_allOpen
+ON changes (sort_key)
+WHERE open = 'Y';
+
+-- covers: byProjectOpenPrev, byProjectOpenNext
+CREATE INDEX changes_byProjectOpen
+ON changes (dest_project_name, sort_key)
+WHERE open = 'Y';
+
+-- covers: allClosedPrev, allClosedNext
+CREATE INDEX changes_allClosed
+ON changes (status, sort_key)
+WHERE open = 'N';
+
+-- covers: byProject
+CREATE INDEX changes_byProject
+ON changes (dest_project_name);
+
+-- covers: byBranchClosedPrev, byBranchClosedNext
+CREATE INDEX changes_byBranchClosed
+ON changes (status, dest_project_name, dest_branch_name, sort_key)
+WHERE open = 'N';
+
+CREATE INDEX changes_key
+ON changes (change_key);
+
+
+-- *********************************************************************
+-- PatchSetApprovalAccess
+-- @PrimaryKey covers: byPatchSet, byPatchSetUser
+-- covers: openByUser
+CREATE INDEX patch_set_approvals_openByUser
+ON patch_set_approvals (account_id)
+WHERE change_open = 'Y';
+
+-- covers: closedByUser
+CREATE INDEX patch_set_approvals_closedByUser
+ON patch_set_approvals (account_id, change_sort_key)
+WHERE change_open = 'N';
+
+
+-- *********************************************************************
+-- ChangeMessageAccess
+-- @PrimaryKey covers: byChange
+
+
+-- *********************************************************************
+-- ContributorAgreementAccess
+-- covers: active
+CREATE INDEX contributor_agreements_active
+ON contributor_agreements (active, short_name);
+
+
+-- *********************************************************************
+-- PatchLineCommentAccess
+-- @PrimaryKey covers: published, draft
+CREATE INDEX patch_comment_drafts
+ON patch_comments (author_id)
+WHERE status = 'd';
+
+
+-- *********************************************************************
+-- PatchSetAncestorAccess
+-- @PrimaryKey covers: ancestorsOf
+-- covers: descendantsOf
+CREATE INDEX patch_set_ancestors_desc
+ON patch_set_ancestors (ancestor_revision);
+
+
+-- *********************************************************************
+-- ProjectAccess
+-- @PrimaryKey covers: all, suggestByName
+-- covers: ownedByGroup
+
+
+-- *********************************************************************
+-- TrackingIdAccess
+--
+CREATE INDEX tracking_ids_byTrkId
+ON tracking_ids (tracking_id);
+
+
+-- *********************************************************************
+-- StarredChangeAccess
+-- @PrimaryKey covers: byAccount
+
+CREATE INDEX starred_changes_byChange
+ON starred_changes (change_id);
+
+-- *********************************************************************
+-- SubmoduleSubscriptionAccess
+
+CREATE INDEX submodule_subscription_access_bySubscription
+ON submodule_subscriptions (submodule_project_name, submodule_branch_name);