Optimize or remove ldap_users counter
What does this MR do?
Optimize ldap_users counter
time_period = { created_at: 28.days.ago..Time.current }
ldap_users: distinct_count(::GroupMember.of_ldap_type.where(time_period), :user_id)
time_period = { }
ldap_users: distinct_count(::GroupMember.of_ldap_type.where(time_period), :user_id)
Add specialised index
in database-lab
exec CREATE INDEX CONCURRENTLY index_members_on_user_id_and_created_at ON members USING btree (user_id,created_at) WHERE ldap = TRUE AND type = 'GroupMember' AND source_type = 'Namespace'
The query has been executed. Duration: 31.115 s
Migration output
== 20200313123934 AddIndexOnUserIdTypeSourceTypeLdapAndCreatedAtToMembers: migrating
-- transaction_open?()
-> 0.0000s
-- index_exists?(:members, [:user_id, :created_at], {:where=>"ldap = TRUE AND type = 'GroupMember' AND source_type = 'Namespace'", :name=>"index_members_on_user_id_created_at", :algorithm=>:concurrently})
-> 0.0047s
-- execute("SET statement_timeout TO 0")
-> 0.0006s
-- add_index(:members, [:user_id, :created_at], {:where=>"ldap = TRUE AND type = 'GroupMember' AND source_type = 'Namespace'", :name=>"index_members_on_user_id_created_at", :algorithm=>:concurrently})
-> 0.0062s
-- execute("RESET ALL")
-> 0.0007s
== 20200313123934 AddIndexOnUserIdTypeSourceTypeLdapAndCreatedAtToMembers: migrated (0.0125s)
Queries in database-lab
query MIN Calculation no period
explain SELECT MIN("members"."user_id") FROM "members" WHERE "members"."type" = 'GroupMember' AND "members"."source_type" = 'Namespace' AND "members"."ldap" = TRUE
Before: Time: 4.198 min https://explain.depesz.com/s/kU3j
Filter: (members.ldap AND ((members.type)::text = 'GroupMember'::text))
After: Time: 0.314 ms https://explain.depesz.com/s/9Giz
No Filter
query MAX Calculation no period
explain SELECT MAX("members"."user_id") FROM "members" WHERE "members"."type" = 'GroupMember' AND "members"."source_type" = 'Namespace' AND "members"."ldap" = TRUE
Before: Time: 1.578 min https://explain.depesz.com/s/EqqW
Filter: (members.ldap AND ((members.type)::text = 'GroupMember'::text))
After: Time: 0.373 ms https://explain.depesz.com/s/d8LV
No Filter
query COUNT DISTINCT no period
explain SELECT COUNT(DISTINCT "members"."user_id") FROM "members" WHERE "members"."type" = 'GroupMember' AND "members"."source_type" = 'Namespace' AND "members"."ldap" = TRUE AND "members"."user_id" BETWEEN 0 AND 9999
Before: Time: 1.311 s https://explain.depesz.com/s/nIMJ
Filter: (members.ldap AND ((members.type)::text = 'GroupMember'::text) AND ((members.source_type)::text = 'Namespace'::text))
After: Time: 0.426 ms https://explain.depesz.com/s/ZIuZ
No Filter
query MIN Calculation with period
explain SELECT MIN("members"."user_id") FROM "members" WHERE "members"."type" = 'GroupMember' AND "members"."source_type" = 'Namespace' AND "members"."ldap" = TRUE AND "members"."created_at" BETWEEN '2020-02-14 11:20:49.490714' AND '2020-03-13 11:20:49.490890'
Before: Time: 36.523 https://explain.depesz.com/s/sOrB
Filter: (members.ldap AND (members.created_at >= '2020-02-14 11:20:49.490714'::timestamp without time zone) AND (members.created_at <= '2020-03-13 11:20:49.49089'::timestamp without time zone) AND ((members.type)::text = 'GroupMember'::text))
After: Time: 0.353 ms https://explain.depesz.com/s/DiLB
No Filter
query MAX Calculation with period
explain SELECT MAX("members"."user_id") FROM "members" WHERE "members"."type" = 'GroupMember' AND "members"."source_type" = 'Namespace' AND "members"."ldap" = TRUE AND "members"."created_at" BETWEEN '2020-02-14 11:20:49.490714' AND '2020-03-13 11:20:49.490890'
Before: Time: 15.351 s https://explain.depesz.com/s/aeQX
Filter: (members.ldap AND (members.created_at >= '2020-02-14 11:20:49.490714'::timestamp without time zone) AND (members.created_at <= '2020-03-13 11:20:49.49089'::timestamp without time zone) AND ((members.type)::text = 'GroupMember'::text))
After: Time: 0.346 ms https://explain.depesz.com/s/gVt4
No Filter
query COUNT DISTINCT Calculation with period
explain SELECT COUNT(DISTINCT "members"."user_id") FROM "members" WHERE "members"."type" = 'GroupMember' AND "members"."source_type" = 'Namespace' AND "members"."ldap" = TRUE AND "members"."created_at" BETWEEN '2020-02-14 11:20:49.490714' AND '2020-03-13 11:20:49.490890' AND "members"."user_id" BETWEEN 0 AND 9999
Before: Time: 637.299 ms https://explain.depesz.com/s/CjfE
Filter: (members.ldap AND (members.created_at >= '2020-02-14 11:20:49.490714'::timestamp without time zone) AND (members.created_at <= '2020-03-13 11:20:49.49089'::timestamp without time zone) AND ((members.type)::text = 'GroupMember'::text) AND ((members.source_type)::text = 'Namespace'::text))
After: Time: 0.376 ms https://explain.depesz.com/s/rXSi
No Filter
Conformity
-
Changelog entry -
Documentation (if required) -
Code review guidelines -
Merge request performance guidelines -
Style guides -
Database guides -
Separation of EE specific content
Security
If this MR contains changes to processing or storing of credentials or tokens, authorization and authentication methods and other items described in the security review guidelines:
-
Label as security and @ mention @gitlab-com/gl-security/appsec -
The MR includes necessary changes to maintain consistency between UI, API, email, or other methods -
Security reports checked/validated by a reviewer from the AppSec team
Closes #210051 (closed)