Add GraphQL query for shared groups

What does this MR do and why?

Related to #562256 (closed)

Needed for Setup "Shared groups" tab (#554631 - closed). We are refactoring the groups overview tabs to shared Vue components. Currently we are using a REST API to get shared groups but it doesn't support all the attributes we need and the shared Vue components work better with GraphQL. This MR adds a GraphQL query for shared groups.

Screenshots or screen recordings

Screenshot_2025-08-19_at_11.52.36_AM

Database review

This GraphQL query

Raw SQL

Click to expand
SELECT
    "namespaces"."id",
    "namespaces"."name",
    "namespaces"."path",
    "namespaces"."owner_id",
    "namespaces"."created_at",
    "namespaces"."updated_at",
    "namespaces"."type",
    "namespaces"."avatar",
    "namespaces"."membership_lock",
    "namespaces"."share_with_group_lock",
    "namespaces"."visibility_level",
    "namespaces"."request_access_enabled",
    "namespaces"."ldap_sync_status",
    "namespaces"."ldap_sync_error",
    "namespaces"."ldap_sync_last_update_at",
    "namespaces"."ldap_sync_last_successful_update_at",
    "namespaces"."ldap_sync_last_sync_at",
    "namespaces"."lfs_enabled",
    "namespaces"."parent_id",
    "namespaces"."shared_runners_minutes_limit",
    "namespaces"."repository_size_limit",
    "namespaces"."require_two_factor_authentication",
    "namespaces"."two_factor_grace_period",
    "namespaces"."project_creation_level",
    "namespaces"."runners_token",
    "namespaces"."file_template_project_id",
    "namespaces"."saml_discovery_token",
    "namespaces"."runners_token_encrypted",
    "namespaces"."custom_project_templates_group_id",
    "namespaces"."auto_devops_enabled",
    "namespaces"."extra_shared_runners_minutes_limit",
    "namespaces"."last_ci_minutes_notification_at",
    "namespaces"."last_ci_minutes_usage_notification_level",
    "namespaces"."subgroup_creation_level",
    "namespaces"."max_pages_size",
    "namespaces"."max_artifacts_size",
    "namespaces"."mentions_disabled",
    "namespaces"."default_branch_protection",
    "namespaces"."max_personal_access_token_lifetime",
    "namespaces"."push_rule_id",
    "namespaces"."shared_runners_enabled",
    "namespaces"."allow_descendants_override_disabled_shared_runners",
    "namespaces"."traversal_ids",
    "namespaces"."organization_id"
FROM
    "namespaces"
    INNER JOIN "group_group_links" ON "namespaces"."id" = "group_group_links"."shared_group_id"
WHERE
    "namespaces"."type" = 'Group'
    AND "group_group_links"."shared_with_group_id" = 9970
    AND ("namespaces"."visibility_level" IN (0, 10, 20)
        OR EXISTS (
            SELECT
                1
            FROM (
                SELECT
                    "namespaces"."id",
                    "namespaces"."name",
                    "namespaces"."path",
                    "namespaces"."owner_id",
                    "namespaces"."created_at",
                    "namespaces"."updated_at",
                    "namespaces"."type",
                    "namespaces"."avatar",
                    "namespaces"."membership_lock",
                    "namespaces"."share_with_group_lock",
                    "namespaces"."visibility_level",
                    "namespaces"."request_access_enabled",
                    "namespaces"."ldap_sync_status",
                    "namespaces"."ldap_sync_error",
                    "namespaces"."ldap_sync_last_update_at",
                    "namespaces"."ldap_sync_last_successful_update_at",
                    "namespaces"."ldap_sync_last_sync_at",
                    "namespaces"."lfs_enabled",
                    "namespaces"."parent_id",
                    "namespaces"."shared_runners_minutes_limit",
                    "namespaces"."repository_size_limit",
                    "namespaces"."require_two_factor_authentication",
                    "namespaces"."two_factor_grace_period",
                    "namespaces"."project_creation_level",
                    "namespaces"."runners_token",
                    "namespaces"."file_template_project_id",
                    "namespaces"."saml_discovery_token",
                    "namespaces"."runners_token_encrypted",
                    "namespaces"."custom_project_templates_group_id",
                    "namespaces"."auto_devops_enabled",
                    "namespaces"."extra_shared_runners_minutes_limit",
                    "namespaces"."last_ci_minutes_notification_at",
                    "namespaces"."last_ci_minutes_usage_notification_level",
                    "namespaces"."subgroup_creation_level",
                    "namespaces"."max_pages_size",
                    "namespaces"."max_artifacts_size",
                    "namespaces"."mentions_disabled",
                    "namespaces"."default_branch_protection",
                    "namespaces"."max_personal_access_token_lifetime",
                    "namespaces"."push_rule_id",
                    "namespaces"."shared_runners_enabled",
                    "namespaces"."allow_descendants_override_disabled_shared_runners",
                    "namespaces"."traversal_ids",
                    "namespaces"."organization_id"
                FROM (( WITH "direct_groups" AS MATERIALIZED (
                            SELECT
                                "namespaces"."id",
                                "namespaces"."name",
                                "namespaces"."path",
                                "namespaces"."owner_id",
                                "namespaces"."created_at",
                                "namespaces"."updated_at",
                                "namespaces"."type",
                                "namespaces"."avatar",
                                "namespaces"."membership_lock",
                                "namespaces"."share_with_group_lock",
                                "namespaces"."visibility_level",
                                "namespaces"."request_access_enabled",
                                "namespaces"."ldap_sync_status",
                                "namespaces"."ldap_sync_error",
                                "namespaces"."ldap_sync_last_update_at",
                                "namespaces"."ldap_sync_last_successful_update_at",
                                "namespaces"."ldap_sync_last_sync_at",
                                "namespaces"."lfs_enabled",
                                "namespaces"."parent_id",
                                "namespaces"."shared_runners_minutes_limit",
                                "namespaces"."repository_size_limit",
                                "namespaces"."require_two_factor_authentication",
                                "namespaces"."two_factor_grace_period",
                                "namespaces"."project_creation_level",
                                "namespaces"."runners_token",
                                "namespaces"."file_template_project_id",
                                "namespaces"."saml_discovery_token",
                                "namespaces"."runners_token_encrypted",
                                "namespaces"."custom_project_templates_group_id",
                                "namespaces"."auto_devops_enabled",
                                "namespaces"."extra_shared_runners_minutes_limit",
                                "namespaces"."last_ci_minutes_notification_at",
                                "namespaces"."last_ci_minutes_usage_notification_level",
                                "namespaces"."subgroup_creation_level",
                                "namespaces"."max_pages_size",
                                "namespaces"."max_artifacts_size",
                                "namespaces"."mentions_disabled",
                                "namespaces"."default_branch_protection",
                                "namespaces"."max_personal_access_token_lifetime",
                                "namespaces"."push_rule_id",
                                "namespaces"."shared_runners_enabled",
                                "namespaces"."allow_descendants_override_disabled_shared_runners",
                                "namespaces"."traversal_ids",
                                "namespaces"."organization_id"
                            FROM
                                "namespaces"
                                INNER JOIN "members" ON "namespaces"."id" = "members"."source_id"
                            WHERE
                                "members"."type" = 'GroupMember'
                                AND "members"."source_type" = 'Namespace'
                                AND "namespaces"."type" = 'Group'
                                AND "members"."user_id" = 1
                                AND "members"."requested_at" IS NULL
                                AND (
                                    access_level >= 10
))
                            SELECT
                                "namespaces"."id",
                                "namespaces"."name",
                                "namespaces"."path",
                                "namespaces"."owner_id",
                                "namespaces"."created_at",
                                "namespaces"."updated_at",
                                "namespaces"."type",
                                "namespaces"."avatar",
                                "namespaces"."membership_lock",
                                "namespaces"."share_with_group_lock",
                                "namespaces"."visibility_level",
                                "namespaces"."request_access_enabled",
                                "namespaces"."ldap_sync_status",
                                "namespaces"."ldap_sync_error",
                                "namespaces"."ldap_sync_last_update_at",
                                "namespaces"."ldap_sync_last_successful_update_at",
                                "namespaces"."ldap_sync_last_sync_at",
                                "namespaces"."lfs_enabled",
                                "namespaces"."parent_id",
                                "namespaces"."shared_runners_minutes_limit",
                                "namespaces"."repository_size_limit",
                                "namespaces"."require_two_factor_authentication",
                                "namespaces"."two_factor_grace_period",
                                "namespaces"."project_creation_level",
                                "namespaces"."runners_token",
                                "namespaces"."file_template_project_id",
                                "namespaces"."saml_discovery_token",
                                "namespaces"."runners_token_encrypted",
                                "namespaces"."custom_project_templates_group_id",
                                "namespaces"."auto_devops_enabled",
                                "namespaces"."extra_shared_runners_minutes_limit",
                                "namespaces"."last_ci_minutes_notification_at",
                                "namespaces"."last_ci_minutes_usage_notification_level",
                                "namespaces"."subgroup_creation_level",
                                "namespaces"."max_pages_size",
                                "namespaces"."max_artifacts_size",
                                "namespaces"."mentions_disabled",
                                "namespaces"."default_branch_protection",
                                "namespaces"."max_personal_access_token_lifetime",
                                "namespaces"."push_rule_id",
                                "namespaces"."shared_runners_enabled",
                                "namespaces"."allow_descendants_override_disabled_shared_runners",
                                "namespaces"."traversal_ids",
                                "namespaces"."organization_id"
                            FROM (( WITH "descendants_base_cte" AS MATERIALIZED (
                                        SELECT
                                            "id",
                                            "traversal_ids"
                                        FROM
                                            "direct_groups" "namespaces"
                                        WHERE
                                            "namespaces"."type" = 'Group'
),
                                        "superset" AS (
                                            SELECT
                                                d1.traversal_ids
                                            FROM
                                                descendants_base_cte d1
                                            WHERE
                                                NOT EXISTS (
                                                    SELECT
                                                        1
                                                    FROM
                                                        descendants_base_cte d2
                                                    WHERE
                                                        d2.id = ANY (d1.traversal_ids)
                                                        AND d2.id <> d1.id))
                                                SELECT DISTINCT
                                                    "namespaces"."id",
                                                    "namespaces"."name",
                                                    "namespaces"."path",
                                                    "namespaces"."owner_id",
                                                    "namespaces"."created_at",
                                                    "namespaces"."updated_at",
                                                    "namespaces"."type",
                                                    "namespaces"."avatar",
                                                    "namespaces"."membership_lock",
                                                    "namespaces"."share_with_group_lock",
                                                    "namespaces"."visibility_level",
                                                    "namespaces"."request_access_enabled",
                                                    "namespaces"."ldap_sync_status",
                                                    "namespaces"."ldap_sync_error",
                                                    "namespaces"."ldap_sync_last_update_at",
                                                    "namespaces"."ldap_sync_last_successful_update_at",
                                                    "namespaces"."ldap_sync_last_sync_at",
                                                    "namespaces"."lfs_enabled",
                                                    "namespaces"."parent_id",
                                                    "namespaces"."shared_runners_minutes_limit",
                                                    "namespaces"."repository_size_limit",
                                                    "namespaces"."require_two_factor_authentication",
                                                    "namespaces"."two_factor_grace_period",
                                                    "namespaces"."project_creation_level",
                                                    "namespaces"."runners_token",
                                                    "namespaces"."file_template_project_id",
                                                    "namespaces"."saml_discovery_token",
                                                    "namespaces"."runners_token_encrypted",
                                                    "namespaces"."custom_project_templates_group_id",
                                                    "namespaces"."auto_devops_enabled",
                                                    "namespaces"."extra_shared_runners_minutes_limit",
                                                    "namespaces"."last_ci_minutes_notification_at",
                                                    "namespaces"."last_ci_minutes_usage_notification_level",
                                                    "namespaces"."subgroup_creation_level",
                                                    "namespaces"."max_pages_size",
                                                    "namespaces"."max_artifacts_size",
                                                    "namespaces"."mentions_disabled",
                                                    "namespaces"."default_branch_protection",
                                                    "namespaces"."max_personal_access_token_lifetime",
                                                    "namespaces"."push_rule_id",
                                                    "namespaces"."shared_runners_enabled",
                                                    "namespaces"."allow_descendants_override_disabled_shared_runners",
                                                    "namespaces"."traversal_ids",
                                                    "namespaces"."organization_id"
                                                FROM
                                                    "superset",
                                                    "namespaces"
                                                WHERE
                                                    "namespaces"."type" = 'Group'
                                                    AND next_traversal_ids_sibling ("superset"."traversal_ids") > "namespaces"."traversal_ids"
                                                    AND "superset"."traversal_ids" <= "namespaces"."traversal_ids")
                                            UNION ( WITH "base_ancestors_cte" AS MATERIALIZED (
                                                    SELECT
                                                        "namespaces"."traversal_ids"
                                                    FROM
                                                        "namespaces"
                                                    WHERE
                                                        "namespaces"."type" = 'Group'
                                                        AND "namespaces"."id" IN (
                                                            SELECT
                                                                "projects"."namespace_id"
                                                            FROM
                                                                "projects"
                                                                INNER JOIN "project_authorizations" ON "projects"."id" = "project_authorizations"."project_id"
                                                            WHERE
                                                                "project_authorizations"."user_id" = 1
))
                                                        SELECT
                                                            "namespaces"."id",
                                                            "namespaces"."name",
                                                            "namespaces"."path",
                                                            "namespaces"."owner_id",
                                                            "namespaces"."created_at",
                                                            "namespaces"."updated_at",
                                                            "namespaces"."type",
                                                            "namespaces"."avatar",
                                                            "namespaces"."membership_lock",
                                                            "namespaces"."share_with_group_lock",
                                                            "namespaces"."visibility_level",
                                                            "namespaces"."request_access_enabled",
                                                            "namespaces"."ldap_sync_status",
                                                            "namespaces"."ldap_sync_error",
                                                            "namespaces"."ldap_sync_last_update_at",
                                                            "namespaces"."ldap_sync_last_successful_update_at",
                                                            "namespaces"."ldap_sync_last_sync_at",
                                                            "namespaces"."lfs_enabled",
                                                            "namespaces"."parent_id",
                                                            "namespaces"."shared_runners_minutes_limit",
                                                            "namespaces"."repository_size_limit",
                                                            "namespaces"."require_two_factor_authentication",
                                                            "namespaces"."two_factor_grace_period",
                                                            "namespaces"."project_creation_level",
                                                            "namespaces"."runners_token",
                                                            "namespaces"."file_template_project_id",
                                                            "namespaces"."saml_discovery_token",
                                                            "namespaces"."runners_token_encrypted",
                                                            "namespaces"."custom_project_templates_group_id",
                                                            "namespaces"."auto_devops_enabled",
                                                            "namespaces"."extra_shared_runners_minutes_limit",
                                                            "namespaces"."last_ci_minutes_notification_at",
                                                            "namespaces"."last_ci_minutes_usage_notification_level",
                                                            "namespaces"."subgroup_creation_level",
                                                            "namespaces"."max_pages_size",
                                                            "namespaces"."max_artifacts_size",
                                                            "namespaces"."mentions_disabled",
                                                            "namespaces"."default_branch_protection",
                                                            "namespaces"."max_personal_access_token_lifetime",
                                                            "namespaces"."push_rule_id",
                                                            "namespaces"."shared_runners_enabled",
                                                            "namespaces"."allow_descendants_override_disabled_shared_runners",
                                                            "namespaces"."traversal_ids",
                                                            "namespaces"."organization_id"
                                                        FROM
                                                            "namespaces"
                                                            INNER JOIN ( SELECT DISTINCT
                                                                    unnest("base_ancestors_cte"."traversal_ids")
                                                                FROM
                                                                    base_ancestors_cte) AS ancestors (ancestor_id) ON namespaces.id = ancestors.ancestor_id
                                                            WHERE
                                                                "namespaces"."type" = 'Group')
                                                        UNION ( WITH "descendants_base_cte" AS MATERIALIZED (
                                                                SELECT
                                                                    "namespaces"."id",
                                                                    "namespaces"."traversal_ids"
                                                                FROM
                                                                    "namespaces"
                                                                    INNER JOIN "group_group_links" ON "group_group_links"."shared_group_id" = "namespaces"."id"
                                                                WHERE
                                                                    "namespaces"."type" = 'Group'
                                                                    AND "group_group_links"."shared_with_group_id" IN (
                                                                        SELECT
                                                                            "namespaces"."id"
                                                                        FROM
                                                                            "direct_groups" "namespaces"
                                                                        WHERE
                                                                            "namespaces"."type" = 'Group'
)
),
                                                                    "superset" AS (
                                                                        SELECT
                                                                            d1.traversal_ids
                                                                        FROM
                                                                            descendants_base_cte d1
                                                                        WHERE
                                                                            NOT EXISTS (
                                                                                SELECT
                                                                                    1
                                                                                FROM
                                                                                    descendants_base_cte d2
                                                                                WHERE
                                                                                    d2.id = ANY (d1.traversal_ids)
                                                                                    AND d2.id <> d1.id))
                                                                            SELECT DISTINCT
                                                                                "namespaces"."id",
                                                                                "namespaces"."name",
                                                                                "namespaces"."path",
                                                                                "namespaces"."owner_id",
                                                                                "namespaces"."created_at",
                                                                                "namespaces"."updated_at",
                                                                                "namespaces"."type",
                                                                                "namespaces"."avatar",
                                                                                "namespaces"."membership_lock",
                                                                                "namespaces"."share_with_group_lock",
                                                                                "namespaces"."visibility_level",
                                                                                "namespaces"."request_access_enabled",
                                                                                "namespaces"."ldap_sync_status",
                                                                                "namespaces"."ldap_sync_error",
                                                                                "namespaces"."ldap_sync_last_update_at",
                                                                                "namespaces"."ldap_sync_last_successful_update_at",
                                                                                "namespaces"."ldap_sync_last_sync_at",
                                                                                "namespaces"."lfs_enabled",
                                                                                "namespaces"."parent_id",
                                                                                "namespaces"."shared_runners_minutes_limit",
                                                                                "namespaces"."repository_size_limit",
                                                                                "namespaces"."require_two_factor_authentication",
                                                                                "namespaces"."two_factor_grace_period",
                                                                                "namespaces"."project_creation_level",
                                                                                "namespaces"."runners_token",
                                                                                "namespaces"."file_template_project_id",
                                                                                "namespaces"."saml_discovery_token",
                                                                                "namespaces"."runners_token_encrypted",
                                                                                "namespaces"."custom_project_templates_group_id",
                                                                                "namespaces"."auto_devops_enabled",
                                                                                "namespaces"."extra_shared_runners_minutes_limit",
                                                                                "namespaces"."last_ci_minutes_notification_at",
                                                                                "namespaces"."last_ci_minutes_usage_notification_level",
                                                                                "namespaces"."subgroup_creation_level",
                                                                                "namespaces"."max_pages_size",
                                                                                "namespaces"."max_artifacts_size",
                                                                                "namespaces"."mentions_disabled",
                                                                                "namespaces"."default_branch_protection",
                                                                                "namespaces"."max_personal_access_token_lifetime",
                                                                                "namespaces"."push_rule_id",
                                                                                "namespaces"."shared_runners_enabled",
                                                                                "namespaces"."allow_descendants_override_disabled_shared_runners",
                                                                                "namespaces"."traversal_ids",
                                                                                "namespaces"."organization_id"
                                                                            FROM
                                                                                "superset",
                                                                                "namespaces"
                                                                            WHERE
                                                                                "namespaces"."type" = 'Group'
                                                                                AND next_traversal_ids_sibling ("superset"."traversal_ids") > "namespaces"."traversal_ids"
                                                                                AND "superset"."traversal_ids" <= "namespaces"."traversal_ids")) namespaces
                                                                    WHERE
                                                                        "namespaces"."type" = 'Group')
                                                                UNION (
                                                                    SELECT
                                                                        "namespaces"."id",
                                                                        "namespaces"."name",
                                                                        "namespaces"."path",
                                                                        "namespaces"."owner_id",
                                                                        "namespaces"."created_at",
                                                                        "namespaces"."updated_at",
                                                                        "namespaces"."type",
                                                                        "namespaces"."avatar",
                                                                        "namespaces"."membership_lock",
                                                                        "namespaces"."share_with_group_lock",
                                                                        "namespaces"."visibility_level",
                                                                        "namespaces"."request_access_enabled",
                                                                        "namespaces"."ldap_sync_status",
                                                                        "namespaces"."ldap_sync_error",
                                                                        "namespaces"."ldap_sync_last_update_at",
                                                                        "namespaces"."ldap_sync_last_successful_update_at",
                                                                        "namespaces"."ldap_sync_last_sync_at",
                                                                        "namespaces"."lfs_enabled",
                                                                        "namespaces"."parent_id",
                                                                        "namespaces"."shared_runners_minutes_limit",
                                                                        "namespaces"."repository_size_limit",
                                                                        "namespaces"."require_two_factor_authentication",
                                                                        "namespaces"."two_factor_grace_period",
                                                                        "namespaces"."project_creation_level",
                                                                        "namespaces"."runners_token",
                                                                        "namespaces"."file_template_project_id",
                                                                        "namespaces"."saml_discovery_token",
                                                                        "namespaces"."runners_token_encrypted",
                                                                        "namespaces"."custom_project_templates_group_id",
                                                                        "namespaces"."auto_devops_enabled",
                                                                        "namespaces"."extra_shared_runners_minutes_limit",
                                                                        "namespaces"."last_ci_minutes_notification_at",
                                                                        "namespaces"."last_ci_minutes_usage_notification_level",
                                                                        "namespaces"."subgroup_creation_level",
                                                                        "namespaces"."max_pages_size",
                                                                        "namespaces"."max_artifacts_size",
                                                                        "namespaces"."mentions_disabled",
                                                                        "namespaces"."default_branch_protection",
                                                                        "namespaces"."max_personal_access_token_lifetime",
                                                                        "namespaces"."push_rule_id",
                                                                        "namespaces"."shared_runners_enabled",
                                                                        "namespaces"."allow_descendants_override_disabled_shared_runners",
                                                                        "namespaces"."traversal_ids",
                                                                        "namespaces"."organization_id"
                                                                    FROM
                                                                        "namespaces"
                                                                        INNER JOIN "members" ON "namespaces"."id" = "members"."source_id"
                                                                    WHERE
                                                                        "members"."type" = 'GroupMember'
                                                                        AND "members"."source_type" = 'Namespace'
                                                                        AND "namespaces"."type" = 'Group'
                                                                        AND "members"."user_id" = 1
                                                                        AND "members"."access_level" = 5
                                                                        AND (EXISTS (
                                                                                SELECT
                                                                                    1
                                                                                FROM
                                                                                    "plans"
                                                                                    INNER JOIN "gitlab_subscriptions" ON "gitlab_subscriptions"."hosted_plan_id" = "plans"."id"
                                                                                WHERE
                                                                                    "plans"."name" IN ('silver', 'premium', 'premium_trial', 'gold', 'ultimate', 'ultimate_trial', 'ultimate_trial_paid_customer', 'opensource')
                                                                                    AND (gitlab_subscriptions.namespace_id = namespaces.id))))) namespaces
                                                                WHERE
                                                                    "namespaces"."type" = 'Group') authorized
                                                            WHERE
                                                                authorized."id" = "namespaces"."id"))
                                                ORDER BY
                                                    "namespaces"."id" DESC
                                                LIMIT 21

Query plan

https://console.postgres.ai/gitlab/gitlab-production-main/sessions/42588/commands/130305

Click to expand
 Limit  (cost=0.99..101682.42 rows=1 width=370) (actual time=7.891..39.727 rows=11 loops=1)
   Buffers: shared hit=27 read=38
   I/O Timings: read=38.996 write=0.000
   ->  Nested Loop  (cost=0.99..101682.42 rows=1 width=370) (actual time=7.890..39.715 rows=11 loops=1)
         Buffers: shared hit=27 read=38
         I/O Timings: read=38.996 write=0.000
         ->  Index Only Scan Backward using index_group_group_links_on_shared_with_group_and_shared_group on public.group_group_links  (cost=0.42..1.95 rows=2 width=8) (actual time=2.189..2.220 rows=11 loops=1)
               Index Cond: (group_group_links.shared_with_group_id = 9970)
               Heap Fetches: 0
               Buffers: shared hit=4 read=3
               I/O Timings: read=2.140 write=0.000
         ->  Index Scan using index_namespaces_on_type_and_id on public.namespaces  (cost=0.57..50840.23 rows=1 width=370) (actual time=3.401..3.402 rows=1 loops=11)
               Index Cond: (((namespaces.type)::text = 'Group'::text) AND (namespaces.id = group_group_links.shared_group_id))
               Filter: ((namespaces.visibility_level = ANY ('{0,10,20}'::integer[])) OR (SubPlan 5))
               Rows Removed by Filter: 0
               Buffers: shared hit=23 read=35
               I/O Timings: read=36.856 write=0.000
               SubPlan 5
                 ->  Subquery Scan on namespaces_6  (cost=50836.62..50836.70 rows=4 width=0) (actual time=0.000..0.000 rows=0 loops=0)
                       I/O Timings: read=0.000 write=0.000
                       ->  HashAggregate  (cost=50836.62..50836.66 rows=4 width=2399) (actual time=0.000..0.000 rows=0 loops=0)
                             Group Key: namespaces_7.id, namespaces_7.name, namespaces_7.path, namespaces_7.owner_id, namespaces_7.created_at, namespaces_7.updated_at, namespaces_7.type, namespaces_7.avatar, namespaces_7.membership_lock, namespaces_7.share_with_group_lock, namespaces_7.visibility_level, namespaces_7.request_access_enabled, namespaces_7.ldap_sync_status, namespaces_7.ldap_sync_error, namespaces_7.ldap_sync_last_update_at, namespaces_7.ldap_sync_last_successful_update_at, namespaces_7.ldap_sync_last_sync_at, namespaces_7.lfs_enabled, namespaces_7.parent_id, namespaces_7.shared_runners_minutes_limit, namespaces_7.repository_size_limit, namespaces_7.require_two_factor_authentication, namespaces_7.two_factor_grace_period, namespaces_7.project_creation_level, namespaces_7.runners_token, namespaces_7.file_template_project_id, namespaces_7.saml_discovery_token, namespaces_7.runners_token_encrypted, namespaces_7.custom_project_templates_group_id, namespaces_7.auto_devops_enabled, namespaces_7.extra_shared_runners_minutes_limit, namespaces_7.last_ci_minutes_notification_at, namespaces_7.last_ci_minutes_usage_notification_level, namespaces_7.subgroup_creation_level, namespaces_7.max_pages_size, namespaces_7.max_artifacts_size, namespaces_7.mentions_disabled, namespaces_7.default_branch_protection, namespaces_7.max_personal_access_token_lifetime, namespaces_7.push_rule_id, namespaces_7.shared_runners_enabled, namespaces_7.allow_descendants_override_disabled_shared_runners, namespaces_7.traversal_ids, namespaces_7.organization_id
                             I/O Timings: read=0.000 write=0.000
                             ->  Append  (cost=50821.64..50836.18 rows=4 width=2399) (actual time=0.000..0.000 rows=0 loops=0)
                                   I/O Timings: read=0.000 write=0.000
                                   ->  HashAggregate  (cost=50788.99..50789.02 rows=3 width=2399) (actual time=0.000..0.000 rows=0 loops=0)
                                         Group Key: namespaces_7.id, namespaces_7.name, namespaces_7.path, namespaces_7.owner_id, namespaces_7.created_at, namespaces_7.updated_at, namespaces_7.type, namespaces_7.avatar, namespaces_7.membership_lock, namespaces_7.share_with_group_lock, namespaces_7.visibility_level, namespaces_7.request_access_enabled, namespaces_7.ldap_sync_status, namespaces_7.ldap_sync_error, namespaces_7.ldap_sync_last_update_at, namespaces_7.ldap_sync_last_successful_update_at, namespaces_7.ldap_sync_last_sync_at, namespaces_7.lfs_enabled, namespaces_7.parent_id, namespaces_7.shared_runners_minutes_limit, namespaces_7.repository_size_limit, namespaces_7.require_two_factor_authentication, namespaces_7.two_factor_grace_period, namespaces_7.project_creation_level, namespaces_7.runners_token, namespaces_7.file_template_project_id, namespaces_7.saml_discovery_token, namespaces_7.runners_token_encrypted, namespaces_7.custom_project_templates_group_id, namespaces_7.auto_devops_enabled, namespaces_7.extra_shared_runners_minutes_limit, namespaces_7.last_ci_minutes_notification_at, namespaces_7.last_ci_minutes_usage_notification_level, namespaces_7.subgroup_creation_level, namespaces_7.max_pages_size, namespaces_7.max_artifacts_size, namespaces_7.mentions_disabled, namespaces_7.default_branch_protection, namespaces_7.max_personal_access_token_lifetime, namespaces_7.push_rule_id, namespaces_7.shared_runners_enabled, namespaces_7.allow_descendants_override_disabled_shared_runners, namespaces_7.traversal_ids, namespaces_7.organization_id
                                         I/O Timings: read=0.000 write=0.000
                                         CTE direct_groups
                                           ->  Nested Loop  (cost=1.13..32.65 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
                                                 I/O Timings: read=0.000 write=0.000
                                                 ->  Index Scan using idx_members_on_user_and_source_and_source_type_and_member_role on public.members  (cost=0.56..21.89 rows=3 width=4) (actual time=0.000..0.000 rows=0 loops=0)
                                                       Index Cond: ((members.user_id = 1) AND ((members.source_type)::text = 'Namespace'::text))
                                                       Filter: ((members.requested_at IS NULL) AND (members.access_level >= 10) AND ((members.type)::text = 'GroupMember'::text))
                                                       Rows Removed by Filter: 0
                                                       I/O Timings: read=0.000 write=0.000
                                                 ->  Index Scan using index_namespaces_on_type_and_id on public.namespaces namespaces_1  (cost=0.57..3.59 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
                                                       Index Cond: (((namespaces_1.type)::text = 'Group'::text) AND (namespaces_1.id = members.source_id))
                                                       I/O Timings: read=0.000 write=0.000
                                         ->  Append  (cost=3.95..50788.66 rows=3 width=2399) (actual time=0.000..0.000 rows=0 loops=0)
                                               I/O Timings: read=0.000 write=0.000
                                               ->  Unique  (cost=3.95..4.06 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
                                                     I/O Timings: read=0.000 write=0.000
                                                     CTE descendants_base_cte
                                                       ->  CTE Scan on direct_groups namespaces_2  (cost=0.00..0.02 rows=1 width=36) (actual time=0.000..0.000 rows=0 loops=0)
                                                             Filter: ((namespaces_2.type)::text = 'Group'::text)
                                                             Rows Removed by Filter: 0
                                                             I/O Timings: read=0.000 write=0.000
                                                     ->  Sort  (cost=3.93..3.93 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
                                                           Sort Key: namespaces_7.name, namespaces_7.path, namespaces_7.owner_id, namespaces_7.created_at, namespaces_7.updated_at, namespaces_7.avatar, namespaces_7.membership_lock, namespaces_7.share_with_group_lock, namespaces_7.visibility_level, namespaces_7.request_access_enabled, namespaces_7.ldap_sync_status, namespaces_7.ldap_sync_error, namespaces_7.ldap_sync_last_update_at, namespaces_7.ldap_sync_last_successful_update_at, namespaces_7.ldap_sync_last_sync_at, namespaces_7.lfs_enabled, namespaces_7.parent_id, namespaces_7.shared_runners_minutes_limit, namespaces_7.repository_size_limit, namespaces_7.require_two_factor_authentication, namespaces_7.two_factor_grace_period, namespaces_7.project_creation_level, namespaces_7.runners_token, namespaces_7.file_template_project_id, namespaces_7.saml_discovery_token, namespaces_7.runners_token_encrypted, namespaces_7.custom_project_templates_group_id, namespaces_7.auto_devops_enabled, namespaces_7.extra_shared_runners_minutes_limit, namespaces_7.last_ci_minutes_notification_at, namespaces_7.last_ci_minutes_usage_notification_level, namespaces_7.subgroup_creation_level, namespaces_7.max_pages_size, namespaces_7.max_artifacts_size, namespaces_7.mentions_disabled, namespaces_7.default_branch_protection, namespaces_7.max_personal_access_token_lifetime, namespaces_7.push_rule_id, namespaces_7.shared_runners_enabled, namespaces_7.allow_descendants_override_disabled_shared_runners, namespaces_7.traversal_ids, namespaces_7.organization_id
                                                           I/O Timings: read=0.000 write=0.000
                                                           ->  Nested Loop  (cost=0.57..3.92 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
                                                                 I/O Timings: read=0.000 write=0.000
                                                                 ->  Nested Loop Anti Join  (cost=0.00..0.07 rows=1 width=32) (actual time=0.000..0.000 rows=0 loops=0)
                                                                       I/O Timings: read=0.000 write=0.000
                                                                       ->  CTE Scan on descendants_base_cte d1  (cost=0.00..0.02 rows=1 width=36) (actual time=0.000..0.000 rows=0 loops=0)
                                                                             I/O Timings: read=0.000 write=0.000
                                                                       ->  CTE Scan on descendants_base_cte d2  (cost=0.00..0.02 rows=1 width=4) (actual time=0.000..0.000 rows=0 loops=0)
                                                                             I/O Timings: read=0.000 write=0.000
                                                                 ->  Index Scan using index_namespaces_on_type_and_id on public.namespaces namespaces_7  (cost=0.57..3.59 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
                                                                       Index Cond: (((namespaces_7.type)::text = 'Group'::text) AND (namespaces_7.id = namespaces.id))
                                                                       I/O Timings: read=0.000 write=0.000
                                               ->  Nested Loop  (cost=50713.12..50766.15 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
                                                     I/O Timings: read=0.000 write=0.000
                                                     CTE base_ancestors_cte
                                                       ->  Nested Loop  (cost=33231.87..50606.16 rows=1038 width=28) (actual time=0.000..0.000 rows=0 loops=0)
                                                             I/O Timings: read=0.000 write=0.000
                                                             ->  HashAggregate  (cost=33231.30..33324.28 rows=9298 width=4) (actual time=0.000..0.000 rows=0 loops=0)
                                                                   Group Key: projects.namespace_id
                                                                   I/O Timings: read=0.000 write=0.000
                                                                   ->  Nested Loop  (cost=1.14..33208.05 rows=9298 width=4) (actual time=0.000..0.000 rows=0 loops=0)
                                                                         I/O Timings: read=0.000 write=0.000
                                                                         ->  Index Only Scan using project_authorizations_pkey on public.project_authorizations  (cost=0.58..377.97 rows=9298 width=4) (actual time=0.000..0.000 rows=0 loops=0)
                                                                               Index Cond: (project_authorizations.user_id = 1)
                                                                               Heap Fetches: 0
                                                                               I/O Timings: read=0.000 write=0.000
                                                                         ->  Index Scan using projects_pkey on public.projects  (cost=0.56..3.53 rows=1 width=8) (actual time=0.000..0.000 rows=0 loops=0)
                                                                               Index Cond: (projects.id = project_authorizations.project_id)
                                                                               I/O Timings: read=0.000 write=0.000
                                                             ->  Index Scan using namespaces_pkey on public.namespaces namespaces_3  (cost=0.57..1.86 rows=1 width=32) (actual time=0.000..0.000 rows=0 loops=0)
                                                                   Index Cond: (namespaces_3.id = projects.namespace_id)
                                                                   Filter: ((namespaces_3.type)::text = 'Group'::text)
                                                                   Rows Removed by Filter: 0
                                                                   I/O Timings: read=0.000 write=0.000
                                                     ->  Index Scan using index_namespaces_on_type_and_id on public.namespaces namespaces_8  (cost=0.57..3.59 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
                                                           Index Cond: (((namespaces_8.type)::text = 'Group'::text) AND (namespaces_8.id = namespaces.id))
                                                           I/O Timings: read=0.000 write=0.000
                                                     ->  Subquery Scan on ancestors  (cost=106.39..156.39 rows=1 width=4) (actual time=0.000..0.000 rows=0 loops=0)
                                                           Filter: (ancestors.ancestor_id = namespaces.id)
                                                           Rows Removed by Filter: 0
                                                           I/O Timings: read=0.000 write=0.000
                                                           ->  HashAggregate  (cost=106.39..131.39 rows=2000 width=4) (actual time=0.000..0.000 rows=0 loops=0)
                                                                 Group Key: unnest(base_ancestors_cte.traversal_ids)
                                                                 I/O Timings: read=0.000 write=0.000
                                                                 ->  ProjectSet  (cost=0.00..80.44 rows=10380 width=4) (actual time=0.000..0.000 rows=0 loops=0)
                                                                       I/O Timings: read=0.000 write=0.000
                                                                       ->  CTE Scan on base_ancestors_cte  (cost=0.00..20.76 rows=1038 width=32) (actual time=0.000..0.000 rows=0 loops=0)
                                                                             I/O Timings: read=0.000 write=0.000
                                               ->  Unique  (cost=18.32..18.43 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
                                                     I/O Timings: read=0.000 write=0.000
                                                     CTE descendants_base_cte
                                                       ->  Nested Loop  (cost=1.01..14.39 rows=1 width=32) (actual time=0.000..0.000 rows=0 loops=0)
                                                             I/O Timings: read=0.000 write=0.000
                                                             ->  Nested Loop  (cost=0.45..2.06 rows=4 width=8) (actual time=0.000..0.000 rows=0 loops=0)
                                                                   I/O Timings: read=0.000 write=0.000
                                                                   ->  HashAggregate  (cost=0.02..0.03 rows=1 width=4) (actual time=0.000..0.000 rows=0 loops=0)
                                                                         Group Key: namespaces_5.id
                                                                         I/O Timings: read=0.000 write=0.000
                                                                         ->  CTE Scan on direct_groups namespaces_5  (cost=0.00..0.02 rows=1 width=4) (actual time=0.000..0.000 rows=0 loops=0)
                                                                               Filter: ((namespaces_5.type)::text = 'Group'::text)
                                                                               Rows Removed by Filter: 0
                                                                               I/O Timings: read=0.000 write=0.000
                                                                   ->  Index Only Scan using index_group_group_links_on_shared_with_group_and_shared_group on public.group_group_links group_group_links_1  (cost=0.42..1.99 rows=4 width=16) (actual time=0.000..0.000 rows=0 loops=0)
                                                                         Index Cond: (group_group_links_1.shared_with_group_id = namespaces_5.id)
                                                                         Heap Fetches: 0
                                                                         I/O Timings: read=0.000 write=0.000
                                                             ->  Index Scan using namespaces_pkey on public.namespaces namespaces_4  (cost=0.57..3.08 rows=1 width=32) (actual time=0.000..0.000 rows=0 loops=0)
                                                                   Index Cond: (namespaces_4.id = group_group_links_1.shared_group_id)
                                                                   Filter: ((namespaces_4.type)::text = 'Group'::text)
                                                                   Rows Removed by Filter: 0
                                                                   I/O Timings: read=0.000 write=0.000
                                                     ->  Sort  (cost=3.93..3.93 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
                                                           Sort Key: namespaces_9.name, namespaces_9.path, namespaces_9.owner_id, namespaces_9.created_at, namespaces_9.updated_at, namespaces_9.avatar, namespaces_9.membership_lock, namespaces_9.share_with_group_lock, namespaces_9.visibility_level, namespaces_9.request_access_enabled, namespaces_9.ldap_sync_status, namespaces_9.ldap_sync_error, namespaces_9.ldap_sync_last_update_at, namespaces_9.ldap_sync_last_successful_update_at, namespaces_9.ldap_sync_last_sync_at, namespaces_9.lfs_enabled, namespaces_9.parent_id, namespaces_9.shared_runners_minutes_limit, namespaces_9.repository_size_limit, namespaces_9.require_two_factor_authentication, namespaces_9.two_factor_grace_period, namespaces_9.project_creation_level, namespaces_9.runners_token, namespaces_9.file_template_project_id, namespaces_9.saml_discovery_token, namespaces_9.runners_token_encrypted, namespaces_9.custom_project_templates_group_id, namespaces_9.auto_devops_enabled, namespaces_9.extra_shared_runners_minutes_limit, namespaces_9.last_ci_minutes_notification_at, namespaces_9.last_ci_minutes_usage_notification_level, namespaces_9.subgroup_creation_level, namespaces_9.max_pages_size, namespaces_9.max_artifacts_size, namespaces_9.mentions_disabled, namespaces_9.default_branch_protection, namespaces_9.max_personal_access_token_lifetime, namespaces_9.push_rule_id, namespaces_9.shared_runners_enabled, namespaces_9.allow_descendants_override_disabled_shared_runners, namespaces_9.traversal_ids, namespaces_9.organization_id
                                                           I/O Timings: read=0.000 write=0.000
                                                           ->  Nested Loop  (cost=0.57..3.92 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
                                                                 I/O Timings: read=0.000 write=0.000
                                                                 ->  Nested Loop Anti Join  (cost=0.00..0.07 rows=1 width=32) (actual time=0.000..0.000 rows=0 loops=0)
                                                                       I/O Timings: read=0.000 write=0.000
                                                                       ->  CTE Scan on descendants_base_cte d1_1  (cost=0.00..0.02 rows=1 width=36) (actual time=0.000..0.000 rows=0 loops=0)
                                                                             I/O Timings: read=0.000 write=0.000
                                                                       ->  CTE Scan on descendants_base_cte d2_1  (cost=0.00..0.02 rows=1 width=4) (actual time=0.000..0.000 rows=0 loops=0)
                                                                             I/O Timings: read=0.000 write=0.000
                                                                 ->  Index Scan using index_namespaces_on_type_and_id on public.namespaces namespaces_9  (cost=0.57..3.59 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
                                                                       Index Cond: (((namespaces_9.type)::text = 'Group'::text) AND (namespaces_9.id = namespaces.id))
                                                                       I/O Timings: read=0.000 write=0.000
                                   ->  Nested Loop  (cost=1.70..14.49 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
                                         I/O Timings: read=0.000 write=0.000
                                         ->  Nested Loop Semi Join  (cost=1.14..10.89 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
                                               I/O Timings: read=0.000 write=0.000
                                               ->  Index Scan using index_namespaces_on_type_and_id on public.namespaces namespaces_10  (cost=0.57..3.59 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
                                                     Index Cond: (((namespaces_10.type)::text = 'Group'::text) AND (namespaces_10.id = namespaces.id))
                                                     I/O Timings: read=0.000 write=0.000
                                               ->  Nested Loop  (cost=0.57..7.29 rows=1 width=4) (actual time=0.000..0.000 rows=0 loops=0)
                                                     I/O Timings: read=0.000 write=0.000
                                                     ->  Index Scan using index_gitlab_subscriptions_on_namespace_id on public.gitlab_subscriptions  (cost=0.43..3.45 rows=1 width=8) (actual time=0.000..0.000 rows=0 loops=0)
                                                           Index Cond: (gitlab_subscriptions.namespace_id = namespaces.id)
                                                           I/O Timings: read=0.000 write=0.000
                                                     ->  Index Scan using plans_pkey on public.plans  (cost=0.14..3.16 rows=1 width=4) (actual time=0.000..0.000 rows=0 loops=0)
                                                           Index Cond: (plans.id = gitlab_subscriptions.hosted_plan_id)
                                                           Filter: ((plans.name)::text = ANY ('{silver,premium,premium_trial,gold,ultimate,ultimate_trial,ultimate_trial_paid_customer,opensource}'::text[]))
                                                           Rows Removed by Filter: 0
                                                           I/O Timings: read=0.000 write=0.000
                                         ->  Index Scan using index_members_on_source_and_type_and_access_level on public.members members_1  (cost=0.56..3.59 rows=1 width=4) (actual time=0.000..0.000 rows=0 loops=0)
                                               Index Cond: ((members_1.source_id = namespaces.id) AND ((members_1.source_type)::text = 'Namespace'::text) AND ((members_1.type)::text = 'GroupMember'::text) AND (members_1.access_level = 5))
                                               Filter: (members_1.user_id = 1)
                                               Rows Removed by Filter: 0
                                               I/O Timings: read=0.000 write=0.000
Settings: random_page_cost = '1.5', seq_page_cost = '4', effective_cache_size = '472585MB', jit = 'off', work_mem = '100MB'

GET /groups/:id/groups/shared REST API

Raw SQL

Click to expand
SELECT
    "namespaces"."id",
    "namespaces"."name",
    "namespaces"."path",
    "namespaces"."owner_id",
    "namespaces"."created_at",
    "namespaces"."updated_at",
    "namespaces"."type",
    "namespaces"."avatar",
    "namespaces"."membership_lock",
    "namespaces"."share_with_group_lock",
    "namespaces"."visibility_level",
    "namespaces"."request_access_enabled",
    "namespaces"."ldap_sync_status",
    "namespaces"."ldap_sync_error",
    "namespaces"."ldap_sync_last_update_at",
    "namespaces"."ldap_sync_last_successful_update_at",
    "namespaces"."ldap_sync_last_sync_at",
    "namespaces"."lfs_enabled",
    "namespaces"."parent_id",
    "namespaces"."shared_runners_minutes_limit",
    "namespaces"."repository_size_limit",
    "namespaces"."require_two_factor_authentication",
    "namespaces"."two_factor_grace_period",
    "namespaces"."project_creation_level",
    "namespaces"."runners_token",
    "namespaces"."file_template_project_id",
    "namespaces"."saml_discovery_token",
    "namespaces"."runners_token_encrypted",
    "namespaces"."custom_project_templates_group_id",
    "namespaces"."auto_devops_enabled",
    "namespaces"."extra_shared_runners_minutes_limit",
    "namespaces"."last_ci_minutes_notification_at",
    "namespaces"."last_ci_minutes_usage_notification_level",
    "namespaces"."subgroup_creation_level",
    "namespaces"."max_pages_size",
    "namespaces"."max_artifacts_size",
    "namespaces"."mentions_disabled",
    "namespaces"."default_branch_protection",
    "namespaces"."max_personal_access_token_lifetime",
    "namespaces"."push_rule_id",
    "namespaces"."shared_runners_enabled",
    "namespaces"."allow_descendants_override_disabled_shared_runners",
    "namespaces"."traversal_ids",
    "namespaces"."organization_id"
FROM
    "namespaces"
    INNER JOIN "group_group_links" ON "namespaces"."id" = "group_group_links"."shared_group_id"
WHERE
    "namespaces"."type" = 'Group'
    AND "group_group_links"."shared_with_group_id" = 9970
    AND ("namespaces"."visibility_level" IN (0, 10, 20)
        OR EXISTS (
            SELECT
                1
            FROM (
                SELECT
                    "namespaces"."id",
                    "namespaces"."name",
                    "namespaces"."path",
                    "namespaces"."owner_id",
                    "namespaces"."created_at",
                    "namespaces"."updated_at",
                    "namespaces"."type",
                    "namespaces"."avatar",
                    "namespaces"."membership_lock",
                    "namespaces"."share_with_group_lock",
                    "namespaces"."visibility_level",
                    "namespaces"."request_access_enabled",
                    "namespaces"."ldap_sync_status",
                    "namespaces"."ldap_sync_error",
                    "namespaces"."ldap_sync_last_update_at",
                    "namespaces"."ldap_sync_last_successful_update_at",
                    "namespaces"."ldap_sync_last_sync_at",
                    "namespaces"."lfs_enabled",
                    "namespaces"."parent_id",
                    "namespaces"."shared_runners_minutes_limit",
                    "namespaces"."repository_size_limit",
                    "namespaces"."require_two_factor_authentication",
                    "namespaces"."two_factor_grace_period",
                    "namespaces"."project_creation_level",
                    "namespaces"."runners_token",
                    "namespaces"."file_template_project_id",
                    "namespaces"."saml_discovery_token",
                    "namespaces"."runners_token_encrypted",
                    "namespaces"."custom_project_templates_group_id",
                    "namespaces"."auto_devops_enabled",
                    "namespaces"."extra_shared_runners_minutes_limit",
                    "namespaces"."last_ci_minutes_notification_at",
                    "namespaces"."last_ci_minutes_usage_notification_level",
                    "namespaces"."subgroup_creation_level",
                    "namespaces"."max_pages_size",
                    "namespaces"."max_artifacts_size",
                    "namespaces"."mentions_disabled",
                    "namespaces"."default_branch_protection",
                    "namespaces"."max_personal_access_token_lifetime",
                    "namespaces"."push_rule_id",
                    "namespaces"."shared_runners_enabled",
                    "namespaces"."allow_descendants_override_disabled_shared_runners",
                    "namespaces"."traversal_ids",
                    "namespaces"."organization_id"
                FROM (( WITH "direct_groups" AS MATERIALIZED (
                            SELECT
                                "namespaces"."id",
                                "namespaces"."name",
                                "namespaces"."path",
                                "namespaces"."owner_id",
                                "namespaces"."created_at",
                                "namespaces"."updated_at",
                                "namespaces"."type",
                                "namespaces"."avatar",
                                "namespaces"."membership_lock",
                                "namespaces"."share_with_group_lock",
                                "namespaces"."visibility_level",
                                "namespaces"."request_access_enabled",
                                "namespaces"."ldap_sync_status",
                                "namespaces"."ldap_sync_error",
                                "namespaces"."ldap_sync_last_update_at",
                                "namespaces"."ldap_sync_last_successful_update_at",
                                "namespaces"."ldap_sync_last_sync_at",
                                "namespaces"."lfs_enabled",
                                "namespaces"."parent_id",
                                "namespaces"."shared_runners_minutes_limit",
                                "namespaces"."repository_size_limit",
                                "namespaces"."require_two_factor_authentication",
                                "namespaces"."two_factor_grace_period",
                                "namespaces"."project_creation_level",
                                "namespaces"."runners_token",
                                "namespaces"."file_template_project_id",
                                "namespaces"."saml_discovery_token",
                                "namespaces"."runners_token_encrypted",
                                "namespaces"."custom_project_templates_group_id",
                                "namespaces"."auto_devops_enabled",
                                "namespaces"."extra_shared_runners_minutes_limit",
                                "namespaces"."last_ci_minutes_notification_at",
                                "namespaces"."last_ci_minutes_usage_notification_level",
                                "namespaces"."subgroup_creation_level",
                                "namespaces"."max_pages_size",
                                "namespaces"."max_artifacts_size",
                                "namespaces"."mentions_disabled",
                                "namespaces"."default_branch_protection",
                                "namespaces"."max_personal_access_token_lifetime",
                                "namespaces"."push_rule_id",
                                "namespaces"."shared_runners_enabled",
                                "namespaces"."allow_descendants_override_disabled_shared_runners",
                                "namespaces"."traversal_ids",
                                "namespaces"."organization_id"
                            FROM
                                "namespaces"
                                INNER JOIN "members" ON "namespaces"."id" = "members"."source_id"
                            WHERE
                                "members"."type" = 'GroupMember'
                                AND "members"."source_type" = 'Namespace'
                                AND "namespaces"."type" = 'Group'
                                AND "members"."user_id" = 1
                                AND "members"."requested_at" IS NULL
                                AND (
                                    access_level >= 10
))
                            SELECT
                                "namespaces"."id",
                                "namespaces"."name",
                                "namespaces"."path",
                                "namespaces"."owner_id",
                                "namespaces"."created_at",
                                "namespaces"."updated_at",
                                "namespaces"."type",
                                "namespaces"."avatar",
                                "namespaces"."membership_lock",
                                "namespaces"."share_with_group_lock",
                                "namespaces"."visibility_level",
                                "namespaces"."request_access_enabled",
                                "namespaces"."ldap_sync_status",
                                "namespaces"."ldap_sync_error",
                                "namespaces"."ldap_sync_last_update_at",
                                "namespaces"."ldap_sync_last_successful_update_at",
                                "namespaces"."ldap_sync_last_sync_at",
                                "namespaces"."lfs_enabled",
                                "namespaces"."parent_id",
                                "namespaces"."shared_runners_minutes_limit",
                                "namespaces"."repository_size_limit",
                                "namespaces"."require_two_factor_authentication",
                                "namespaces"."two_factor_grace_period",
                                "namespaces"."project_creation_level",
                                "namespaces"."runners_token",
                                "namespaces"."file_template_project_id",
                                "namespaces"."saml_discovery_token",
                                "namespaces"."runners_token_encrypted",
                                "namespaces"."custom_project_templates_group_id",
                                "namespaces"."auto_devops_enabled",
                                "namespaces"."extra_shared_runners_minutes_limit",
                                "namespaces"."last_ci_minutes_notification_at",
                                "namespaces"."last_ci_minutes_usage_notification_level",
                                "namespaces"."subgroup_creation_level",
                                "namespaces"."max_pages_size",
                                "namespaces"."max_artifacts_size",
                                "namespaces"."mentions_disabled",
                                "namespaces"."default_branch_protection",
                                "namespaces"."max_personal_access_token_lifetime",
                                "namespaces"."push_rule_id",
                                "namespaces"."shared_runners_enabled",
                                "namespaces"."allow_descendants_override_disabled_shared_runners",
                                "namespaces"."traversal_ids",
                                "namespaces"."organization_id"
                            FROM (( WITH "descendants_base_cte" AS MATERIALIZED (
                                        SELECT
                                            "id",
                                            "traversal_ids"
                                        FROM
                                            "direct_groups" "namespaces"
                                        WHERE
                                            "namespaces"."type" = 'Group'
),
                                        "superset" AS (
                                            SELECT
                                                d1.traversal_ids
                                            FROM
                                                descendants_base_cte d1
                                            WHERE
                                                NOT EXISTS (
                                                    SELECT
                                                        1
                                                    FROM
                                                        descendants_base_cte d2
                                                    WHERE
                                                        d2.id = ANY (d1.traversal_ids)
                                                        AND d2.id <> d1.id))
                                                SELECT DISTINCT
                                                    "namespaces"."id",
                                                    "namespaces"."name",
                                                    "namespaces"."path",
                                                    "namespaces"."owner_id",
                                                    "namespaces"."created_at",
                                                    "namespaces"."updated_at",
                                                    "namespaces"."type",
                                                    "namespaces"."avatar",
                                                    "namespaces"."membership_lock",
                                                    "namespaces"."share_with_group_lock",
                                                    "namespaces"."visibility_level",
                                                    "namespaces"."request_access_enabled",
                                                    "namespaces"."ldap_sync_status",
                                                    "namespaces"."ldap_sync_error",
                                                    "namespaces"."ldap_sync_last_update_at",
                                                    "namespaces"."ldap_sync_last_successful_update_at",
                                                    "namespaces"."ldap_sync_last_sync_at",
                                                    "namespaces"."lfs_enabled",
                                                    "namespaces"."parent_id",
                                                    "namespaces"."shared_runners_minutes_limit",
                                                    "namespaces"."repository_size_limit",
                                                    "namespaces"."require_two_factor_authentication",
                                                    "namespaces"."two_factor_grace_period",
                                                    "namespaces"."project_creation_level",
                                                    "namespaces"."runners_token",
                                                    "namespaces"."file_template_project_id",
                                                    "namespaces"."saml_discovery_token",
                                                    "namespaces"."runners_token_encrypted",
                                                    "namespaces"."custom_project_templates_group_id",
                                                    "namespaces"."auto_devops_enabled",
                                                    "namespaces"."extra_shared_runners_minutes_limit",
                                                    "namespaces"."last_ci_minutes_notification_at",
                                                    "namespaces"."last_ci_minutes_usage_notification_level",
                                                    "namespaces"."subgroup_creation_level",
                                                    "namespaces"."max_pages_size",
                                                    "namespaces"."max_artifacts_size",
                                                    "namespaces"."mentions_disabled",
                                                    "namespaces"."default_branch_protection",
                                                    "namespaces"."max_personal_access_token_lifetime",
                                                    "namespaces"."push_rule_id",
                                                    "namespaces"."shared_runners_enabled",
                                                    "namespaces"."allow_descendants_override_disabled_shared_runners",
                                                    "namespaces"."traversal_ids",
                                                    "namespaces"."organization_id"
                                                FROM
                                                    "superset",
                                                    "namespaces"
                                                WHERE
                                                    "namespaces"."type" = 'Group'
                                                    AND next_traversal_ids_sibling ("superset"."traversal_ids") > "namespaces"."traversal_ids"
                                                    AND "superset"."traversal_ids" <= "namespaces"."traversal_ids")
                                            UNION ( WITH "base_ancestors_cte" AS MATERIALIZED (
                                                    SELECT
                                                        "namespaces"."traversal_ids"
                                                    FROM
                                                        "namespaces"
                                                    WHERE
                                                        "namespaces"."type" = 'Group'
                                                        AND "namespaces"."id" IN (
                                                            SELECT
                                                                "projects"."namespace_id"
                                                            FROM
                                                                "projects"
                                                                INNER JOIN "project_authorizations" ON "projects"."id" = "project_authorizations"."project_id"
                                                            WHERE
                                                                "project_authorizations"."user_id" = 1
))
                                                        SELECT
                                                            "namespaces"."id",
                                                            "namespaces"."name",
                                                            "namespaces"."path",
                                                            "namespaces"."owner_id",
                                                            "namespaces"."created_at",
                                                            "namespaces"."updated_at",
                                                            "namespaces"."type",
                                                            "namespaces"."avatar",
                                                            "namespaces"."membership_lock",
                                                            "namespaces"."share_with_group_lock",
                                                            "namespaces"."visibility_level",
                                                            "namespaces"."request_access_enabled",
                                                            "namespaces"."ldap_sync_status",
                                                            "namespaces"."ldap_sync_error",
                                                            "namespaces"."ldap_sync_last_update_at",
                                                            "namespaces"."ldap_sync_last_successful_update_at",
                                                            "namespaces"."ldap_sync_last_sync_at",
                                                            "namespaces"."lfs_enabled",
                                                            "namespaces"."parent_id",
                                                            "namespaces"."shared_runners_minutes_limit",
                                                            "namespaces"."repository_size_limit",
                                                            "namespaces"."require_two_factor_authentication",
                                                            "namespaces"."two_factor_grace_period",
                                                            "namespaces"."project_creation_level",
                                                            "namespaces"."runners_token",
                                                            "namespaces"."file_template_project_id",
                                                            "namespaces"."saml_discovery_token",
                                                            "namespaces"."runners_token_encrypted",
                                                            "namespaces"."custom_project_templates_group_id",
                                                            "namespaces"."auto_devops_enabled",
                                                            "namespaces"."extra_shared_runners_minutes_limit",
                                                            "namespaces"."last_ci_minutes_notification_at",
                                                            "namespaces"."last_ci_minutes_usage_notification_level",
                                                            "namespaces"."subgroup_creation_level",
                                                            "namespaces"."max_pages_size",
                                                            "namespaces"."max_artifacts_size",
                                                            "namespaces"."mentions_disabled",
                                                            "namespaces"."default_branch_protection",
                                                            "namespaces"."max_personal_access_token_lifetime",
                                                            "namespaces"."push_rule_id",
                                                            "namespaces"."shared_runners_enabled",
                                                            "namespaces"."allow_descendants_override_disabled_shared_runners",
                                                            "namespaces"."traversal_ids",
                                                            "namespaces"."organization_id"
                                                        FROM
                                                            "namespaces"
                                                            INNER JOIN ( SELECT DISTINCT
                                                                    unnest("base_ancestors_cte"."traversal_ids")
                                                                FROM
                                                                    base_ancestors_cte) AS ancestors (ancestor_id) ON namespaces.id = ancestors.ancestor_id
                                                            WHERE
                                                                "namespaces"."type" = 'Group')
                                                        UNION ( WITH "descendants_base_cte" AS MATERIALIZED (
                                                                SELECT
                                                                    "namespaces"."id",
                                                                    "namespaces"."traversal_ids"
                                                                FROM
                                                                    "namespaces"
                                                                    INNER JOIN "group_group_links" ON "group_group_links"."shared_group_id" = "namespaces"."id"
                                                                WHERE
                                                                    "namespaces"."type" = 'Group'
                                                                    AND "group_group_links"."shared_with_group_id" IN (
                                                                        SELECT
                                                                            "namespaces"."id"
                                                                        FROM
                                                                            "direct_groups" "namespaces"
                                                                        WHERE
                                                                            "namespaces"."type" = 'Group'
)
),
                                                                    "superset" AS (
                                                                        SELECT
                                                                            d1.traversal_ids
                                                                        FROM
                                                                            descendants_base_cte d1
                                                                        WHERE
                                                                            NOT EXISTS (
                                                                                SELECT
                                                                                    1
                                                                                FROM
                                                                                    descendants_base_cte d2
                                                                                WHERE
                                                                                    d2.id = ANY (d1.traversal_ids)
                                                                                    AND d2.id <> d1.id))
                                                                            SELECT DISTINCT
                                                                                "namespaces"."id",
                                                                                "namespaces"."name",
                                                                                "namespaces"."path",
                                                                                "namespaces"."owner_id",
                                                                                "namespaces"."created_at",
                                                                                "namespaces"."updated_at",
                                                                                "namespaces"."type",
                                                                                "namespaces"."avatar",
                                                                                "namespaces"."membership_lock",
                                                                                "namespaces"."share_with_group_lock",
                                                                                "namespaces"."visibility_level",
                                                                                "namespaces"."request_access_enabled",
                                                                                "namespaces"."ldap_sync_status",
                                                                                "namespaces"."ldap_sync_error",
                                                                                "namespaces"."ldap_sync_last_update_at",
                                                                                "namespaces"."ldap_sync_last_successful_update_at",
                                                                                "namespaces"."ldap_sync_last_sync_at",
                                                                                "namespaces"."lfs_enabled",
                                                                                "namespaces"."parent_id",
                                                                                "namespaces"."shared_runners_minutes_limit",
                                                                                "namespaces"."repository_size_limit",
                                                                                "namespaces"."require_two_factor_authentication",
                                                                                "namespaces"."two_factor_grace_period",
                                                                                "namespaces"."project_creation_level",
                                                                                "namespaces"."runners_token",
                                                                                "namespaces"."file_template_project_id",
                                                                                "namespaces"."saml_discovery_token",
                                                                                "namespaces"."runners_token_encrypted",
                                                                                "namespaces"."custom_project_templates_group_id",
                                                                                "namespaces"."auto_devops_enabled",
                                                                                "namespaces"."extra_shared_runners_minutes_limit",
                                                                                "namespaces"."last_ci_minutes_notification_at",
                                                                                "namespaces"."last_ci_minutes_usage_notification_level",
                                                                                "namespaces"."subgroup_creation_level",
                                                                                "namespaces"."max_pages_size",
                                                                                "namespaces"."max_artifacts_size",
                                                                                "namespaces"."mentions_disabled",
                                                                                "namespaces"."default_branch_protection",
                                                                                "namespaces"."max_personal_access_token_lifetime",
                                                                                "namespaces"."push_rule_id",
                                                                                "namespaces"."shared_runners_enabled",
                                                                                "namespaces"."allow_descendants_override_disabled_shared_runners",
                                                                                "namespaces"."traversal_ids",
                                                                                "namespaces"."organization_id"
                                                                            FROM
                                                                                "superset",
                                                                                "namespaces"
                                                                            WHERE
                                                                                "namespaces"."type" = 'Group'
                                                                                AND next_traversal_ids_sibling ("superset"."traversal_ids") > "namespaces"."traversal_ids"
                                                                                AND "superset"."traversal_ids" <= "namespaces"."traversal_ids")) namespaces
                                                                    WHERE
                                                                        "namespaces"."type" = 'Group')
                                                                UNION (
                                                                    SELECT
                                                                        "namespaces"."id",
                                                                        "namespaces"."name",
                                                                        "namespaces"."path",
                                                                        "namespaces"."owner_id",
                                                                        "namespaces"."created_at",
                                                                        "namespaces"."updated_at",
                                                                        "namespaces"."type",
                                                                        "namespaces"."avatar",
                                                                        "namespaces"."membership_lock",
                                                                        "namespaces"."share_with_group_lock",
                                                                        "namespaces"."visibility_level",
                                                                        "namespaces"."request_access_enabled",
                                                                        "namespaces"."ldap_sync_status",
                                                                        "namespaces"."ldap_sync_error",
                                                                        "namespaces"."ldap_sync_last_update_at",
                                                                        "namespaces"."ldap_sync_last_successful_update_at",
                                                                        "namespaces"."ldap_sync_last_sync_at",
                                                                        "namespaces"."lfs_enabled",
                                                                        "namespaces"."parent_id",
                                                                        "namespaces"."shared_runners_minutes_limit",
                                                                        "namespaces"."repository_size_limit",
                                                                        "namespaces"."require_two_factor_authentication",
                                                                        "namespaces"."two_factor_grace_period",
                                                                        "namespaces"."project_creation_level",
                                                                        "namespaces"."runners_token",
                                                                        "namespaces"."file_template_project_id",
                                                                        "namespaces"."saml_discovery_token",
                                                                        "namespaces"."runners_token_encrypted",
                                                                        "namespaces"."custom_project_templates_group_id",
                                                                        "namespaces"."auto_devops_enabled",
                                                                        "namespaces"."extra_shared_runners_minutes_limit",
                                                                        "namespaces"."last_ci_minutes_notification_at",
                                                                        "namespaces"."last_ci_minutes_usage_notification_level",
                                                                        "namespaces"."subgroup_creation_level",
                                                                        "namespaces"."max_pages_size",
                                                                        "namespaces"."max_artifacts_size",
                                                                        "namespaces"."mentions_disabled",
                                                                        "namespaces"."default_branch_protection",
                                                                        "namespaces"."max_personal_access_token_lifetime",
                                                                        "namespaces"."push_rule_id",
                                                                        "namespaces"."shared_runners_enabled",
                                                                        "namespaces"."allow_descendants_override_disabled_shared_runners",
                                                                        "namespaces"."traversal_ids",
                                                                        "namespaces"."organization_id"
                                                                    FROM
                                                                        "namespaces"
                                                                        INNER JOIN "members" ON "namespaces"."id" = "members"."source_id"
                                                                    WHERE
                                                                        "members"."type" = 'GroupMember'
                                                                        AND "members"."source_type" = 'Namespace'
                                                                        AND "namespaces"."type" = 'Group'
                                                                        AND "members"."user_id" = 1
                                                                        AND "members"."access_level" = 5
                                                                        AND (EXISTS (
                                                                                SELECT
                                                                                    1
                                                                                FROM
                                                                                    "plans"
                                                                                    INNER JOIN "gitlab_subscriptions" ON "gitlab_subscriptions"."hosted_plan_id" = "plans"."id"
                                                                                WHERE
                                                                                    "plans"."name" IN ('silver', 'premium', 'premium_trial', 'gold', 'ultimate', 'ultimate_trial', 'ultimate_trial_paid_customer', 'opensource')
                                                                                    AND (gitlab_subscriptions.namespace_id = namespaces.id))))) namespaces
                                                                WHERE
                                                                    "namespaces"."type" = 'Group') authorized
                                                            WHERE
                                                                authorized."id" = "namespaces"."id"))
                                                ORDER BY
                                                    "namespaces"."name" DESC,
                                                    "namespaces"."id" ASC
                                                LIMIT 20 OFFSET 0

Query plan

https://postgres.ai/console/gitlab/gitlab-production-main/sessions/42588/commands/130307

Click to expand
 Limit  (cost=101682.43..101682.44 rows=1 width=370) (actual time=0.207..0.213 rows=11 loops=1)
   Buffers: shared hit=71
   I/O Timings: read=0.000 write=0.000
   ->  Sort  (cost=101682.43..101682.44 rows=1 width=370) (actual time=0.206..0.211 rows=11 loops=1)
         Sort Key: namespaces.name DESC, namespaces.id
         Sort Method: quicksort  Memory: 27kB
         Buffers: shared hit=71
         I/O Timings: read=0.000 write=0.000
         ->  Nested Loop  (cost=0.99..101682.42 rows=1 width=370) (actual time=0.053..0.154 rows=11 loops=1)
               Buffers: shared hit=65
               I/O Timings: read=0.000 write=0.000
               ->  Index Only Scan using index_group_group_links_on_shared_with_group_and_shared_group on public.group_group_links  (cost=0.42..1.95 rows=2 width=8) (actual time=0.016..0.019 rows=11 loops=1)
                     Index Cond: (group_group_links.shared_with_group_id = 9970)
                     Heap Fetches: 0
                     Buffers: shared hit=7
                     I/O Timings: read=0.000 write=0.000
               ->  Index Scan using index_namespaces_on_type_and_id on public.namespaces  (cost=0.57..50840.23 rows=1 width=370) (actual time=0.011..0.012 rows=1 loops=11)
                     Index Cond: (((namespaces.type)::text = 'Group'::text) AND (namespaces.id = group_group_links.shared_group_id))
                     Filter: ((namespaces.visibility_level = ANY ('{0,10,20}'::integer[])) OR (SubPlan 5))
                     Rows Removed by Filter: 0
                     Buffers: shared hit=58
                     I/O Timings: read=0.000 write=0.000
                     SubPlan 5
                       ->  Subquery Scan on namespaces_6  (cost=50836.62..50836.70 rows=4 width=0) (actual time=0.000..0.000 rows=0 loops=0)
                             I/O Timings: read=0.000 write=0.000
                             ->  HashAggregate  (cost=50836.62..50836.66 rows=4 width=2399) (actual time=0.000..0.000 rows=0 loops=0)
                                   Group Key: namespaces_7.id, namespaces_7.name, namespaces_7.path, namespaces_7.owner_id, namespaces_7.created_at, namespaces_7.updated_at, namespaces_7.type, namespaces_7.avatar, namespaces_7.membership_lock, namespaces_7.share_with_group_lock, namespaces_7.visibility_level, namespaces_7.request_access_enabled, namespaces_7.ldap_sync_status, namespaces_7.ldap_sync_error, namespaces_7.ldap_sync_last_update_at, namespaces_7.ldap_sync_last_successful_update_at, namespaces_7.ldap_sync_last_sync_at, namespaces_7.lfs_enabled, namespaces_7.parent_id, namespaces_7.shared_runners_minutes_limit, namespaces_7.repository_size_limit, namespaces_7.require_two_factor_authentication, namespaces_7.two_factor_grace_period, namespaces_7.project_creation_level, namespaces_7.runners_token, namespaces_7.file_template_project_id, namespaces_7.saml_discovery_token, namespaces_7.runners_token_encrypted, namespaces_7.custom_project_templates_group_id, namespaces_7.auto_devops_enabled, namespaces_7.extra_shared_runners_minutes_limit, namespaces_7.last_ci_minutes_notification_at, namespaces_7.last_ci_minutes_usage_notification_level, namespaces_7.subgroup_creation_level, namespaces_7.max_pages_size, namespaces_7.max_artifacts_size, namespaces_7.mentions_disabled, namespaces_7.default_branch_protection, namespaces_7.max_personal_access_token_lifetime, namespaces_7.push_rule_id, namespaces_7.shared_runners_enabled, namespaces_7.allow_descendants_override_disabled_shared_runners, namespaces_7.traversal_ids, namespaces_7.organization_id
                                   I/O Timings: read=0.000 write=0.000
                                   ->  Append  (cost=50821.64..50836.18 rows=4 width=2399) (actual time=0.000..0.000 rows=0 loops=0)
                                         I/O Timings: read=0.000 write=0.000
                                         ->  HashAggregate  (cost=50788.99..50789.02 rows=3 width=2399) (actual time=0.000..0.000 rows=0 loops=0)
                                               Group Key: namespaces_7.id, namespaces_7.name, namespaces_7.path, namespaces_7.owner_id, namespaces_7.created_at, namespaces_7.updated_at, namespaces_7.type, namespaces_7.avatar, namespaces_7.membership_lock, namespaces_7.share_with_group_lock, namespaces_7.visibility_level, namespaces_7.request_access_enabled, namespaces_7.ldap_sync_status, namespaces_7.ldap_sync_error, namespaces_7.ldap_sync_last_update_at, namespaces_7.ldap_sync_last_successful_update_at, namespaces_7.ldap_sync_last_sync_at, namespaces_7.lfs_enabled, namespaces_7.parent_id, namespaces_7.shared_runners_minutes_limit, namespaces_7.repository_size_limit, namespaces_7.require_two_factor_authentication, namespaces_7.two_factor_grace_period, namespaces_7.project_creation_level, namespaces_7.runners_token, namespaces_7.file_template_project_id, namespaces_7.saml_discovery_token, namespaces_7.runners_token_encrypted, namespaces_7.custom_project_templates_group_id, namespaces_7.auto_devops_enabled, namespaces_7.extra_shared_runners_minutes_limit, namespaces_7.last_ci_minutes_notification_at, namespaces_7.last_ci_minutes_usage_notification_level, namespaces_7.subgroup_creation_level, namespaces_7.max_pages_size, namespaces_7.max_artifacts_size, namespaces_7.mentions_disabled, namespaces_7.default_branch_protection, namespaces_7.max_personal_access_token_lifetime, namespaces_7.push_rule_id, namespaces_7.shared_runners_enabled, namespaces_7.allow_descendants_override_disabled_shared_runners, namespaces_7.traversal_ids, namespaces_7.organization_id
                                               I/O Timings: read=0.000 write=0.000
                                               CTE direct_groups
                                                 ->  Nested Loop  (cost=1.13..32.65 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
                                                       I/O Timings: read=0.000 write=0.000
                                                       ->  Index Scan using idx_members_on_user_and_source_and_source_type_and_member_role on public.members  (cost=0.56..21.89 rows=3 width=4) (actual time=0.000..0.000 rows=0 loops=0)
                                                             Index Cond: ((members.user_id = 1) AND ((members.source_type)::text = 'Namespace'::text))
                                                             Filter: ((members.requested_at IS NULL) AND (members.access_level >= 10) AND ((members.type)::text = 'GroupMember'::text))
                                                             Rows Removed by Filter: 0
                                                             I/O Timings: read=0.000 write=0.000
                                                       ->  Index Scan using index_namespaces_on_type_and_id on public.namespaces namespaces_1  (cost=0.57..3.59 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
                                                             Index Cond: (((namespaces_1.type)::text = 'Group'::text) AND (namespaces_1.id = members.source_id))
                                                             I/O Timings: read=0.000 write=0.000
                                               ->  Append  (cost=3.95..50788.66 rows=3 width=2399) (actual time=0.000..0.000 rows=0 loops=0)
                                                     I/O Timings: read=0.000 write=0.000
                                                     ->  Unique  (cost=3.95..4.06 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
                                                           I/O Timings: read=0.000 write=0.000
                                                           CTE descendants_base_cte
                                                             ->  CTE Scan on direct_groups namespaces_2  (cost=0.00..0.02 rows=1 width=36) (actual time=0.000..0.000 rows=0 loops=0)
                                                                   Filter: ((namespaces_2.type)::text = 'Group'::text)
                                                                   Rows Removed by Filter: 0
                                                                   I/O Timings: read=0.000 write=0.000
                                                           ->  Sort  (cost=3.93..3.93 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
                                                                 Sort Key: namespaces_7.name, namespaces_7.path, namespaces_7.owner_id, namespaces_7.created_at, namespaces_7.updated_at, namespaces_7.avatar, namespaces_7.membership_lock, namespaces_7.share_with_group_lock, namespaces_7.visibility_level, namespaces_7.request_access_enabled, namespaces_7.ldap_sync_status, namespaces_7.ldap_sync_error, namespaces_7.ldap_sync_last_update_at, namespaces_7.ldap_sync_last_successful_update_at, namespaces_7.ldap_sync_last_sync_at, namespaces_7.lfs_enabled, namespaces_7.parent_id, namespaces_7.shared_runners_minutes_limit, namespaces_7.repository_size_limit, namespaces_7.require_two_factor_authentication, namespaces_7.two_factor_grace_period, namespaces_7.project_creation_level, namespaces_7.runners_token, namespaces_7.file_template_project_id, namespaces_7.saml_discovery_token, namespaces_7.runners_token_encrypted, namespaces_7.custom_project_templates_group_id, namespaces_7.auto_devops_enabled, namespaces_7.extra_shared_runners_minutes_limit, namespaces_7.last_ci_minutes_notification_at, namespaces_7.last_ci_minutes_usage_notification_level, namespaces_7.subgroup_creation_level, namespaces_7.max_pages_size, namespaces_7.max_artifacts_size, namespaces_7.mentions_disabled, namespaces_7.default_branch_protection, namespaces_7.max_personal_access_token_lifetime, namespaces_7.push_rule_id, namespaces_7.shared_runners_enabled, namespaces_7.allow_descendants_override_disabled_shared_runners, namespaces_7.traversal_ids, namespaces_7.organization_id
                                                                 I/O Timings: read=0.000 write=0.000
                                                                 ->  Nested Loop  (cost=0.57..3.92 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
                                                                       I/O Timings: read=0.000 write=0.000
                                                                       ->  Nested Loop Anti Join  (cost=0.00..0.07 rows=1 width=32) (actual time=0.000..0.000 rows=0 loops=0)
                                                                             I/O Timings: read=0.000 write=0.000
                                                                             ->  CTE Scan on descendants_base_cte d1  (cost=0.00..0.02 rows=1 width=36) (actual time=0.000..0.000 rows=0 loops=0)
                                                                                   I/O Timings: read=0.000 write=0.000
                                                                             ->  CTE Scan on descendants_base_cte d2  (cost=0.00..0.02 rows=1 width=4) (actual time=0.000..0.000 rows=0 loops=0)
                                                                                   I/O Timings: read=0.000 write=0.000
                                                                       ->  Index Scan using index_namespaces_on_type_and_id on public.namespaces namespaces_7  (cost=0.57..3.59 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
                                                                             Index Cond: (((namespaces_7.type)::text = 'Group'::text) AND (namespaces_7.id = namespaces.id))
                                                                             I/O Timings: read=0.000 write=0.000
                                                     ->  Nested Loop  (cost=50713.12..50766.15 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
                                                           I/O Timings: read=0.000 write=0.000
                                                           CTE base_ancestors_cte
                                                             ->  Nested Loop  (cost=33231.87..50606.16 rows=1038 width=28) (actual time=0.000..0.000 rows=0 loops=0)
                                                                   I/O Timings: read=0.000 write=0.000
                                                                   ->  HashAggregate  (cost=33231.30..33324.28 rows=9298 width=4) (actual time=0.000..0.000 rows=0 loops=0)
                                                                         Group Key: projects.namespace_id
                                                                         I/O Timings: read=0.000 write=0.000
                                                                         ->  Nested Loop  (cost=1.14..33208.05 rows=9298 width=4) (actual time=0.000..0.000 rows=0 loops=0)
                                                                               I/O Timings: read=0.000 write=0.000
                                                                               ->  Index Only Scan using project_authorizations_pkey on public.project_authorizations  (cost=0.58..377.97 rows=9298 width=4) (actual time=0.000..0.000 rows=0 loops=0)
                                                                                     Index Cond: (project_authorizations.user_id = 1)
                                                                                     Heap Fetches: 0
                                                                                     I/O Timings: read=0.000 write=0.000
                                                                               ->  Index Scan using projects_pkey on public.projects  (cost=0.56..3.53 rows=1 width=8) (actual time=0.000..0.000 rows=0 loops=0)
                                                                                     Index Cond: (projects.id = project_authorizations.project_id)
                                                                                     I/O Timings: read=0.000 write=0.000
                                                                   ->  Index Scan using namespaces_pkey on public.namespaces namespaces_3  (cost=0.57..1.86 rows=1 width=32) (actual time=0.000..0.000 rows=0 loops=0)
                                                                         Index Cond: (namespaces_3.id = projects.namespace_id)
                                                                         Filter: ((namespaces_3.type)::text = 'Group'::text)
                                                                         Rows Removed by Filter: 0
                                                                         I/O Timings: read=0.000 write=0.000
                                                           ->  Index Scan using index_namespaces_on_type_and_id on public.namespaces namespaces_8  (cost=0.57..3.59 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
                                                                 Index Cond: (((namespaces_8.type)::text = 'Group'::text) AND (namespaces_8.id = namespaces.id))
                                                                 I/O Timings: read=0.000 write=0.000
                                                           ->  Subquery Scan on ancestors  (cost=106.39..156.39 rows=1 width=4) (actual time=0.000..0.000 rows=0 loops=0)
                                                                 Filter: (ancestors.ancestor_id = namespaces.id)
                                                                 Rows Removed by Filter: 0
                                                                 I/O Timings: read=0.000 write=0.000
                                                                 ->  HashAggregate  (cost=106.39..131.39 rows=2000 width=4) (actual time=0.000..0.000 rows=0 loops=0)
                                                                       Group Key: unnest(base_ancestors_cte.traversal_ids)
                                                                       I/O Timings: read=0.000 write=0.000
                                                                       ->  ProjectSet  (cost=0.00..80.44 rows=10380 width=4) (actual time=0.000..0.000 rows=0 loops=0)
                                                                             I/O Timings: read=0.000 write=0.000
                                                                             ->  CTE Scan on base_ancestors_cte  (cost=0.00..20.76 rows=1038 width=32) (actual time=0.000..0.000 rows=0 loops=0)
                                                                                   I/O Timings: read=0.000 write=0.000
                                                     ->  Unique  (cost=18.32..18.43 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
                                                           I/O Timings: read=0.000 write=0.000
                                                           CTE descendants_base_cte
                                                             ->  Nested Loop  (cost=1.01..14.39 rows=1 width=32) (actual time=0.000..0.000 rows=0 loops=0)
                                                                   I/O Timings: read=0.000 write=0.000
                                                                   ->  Nested Loop  (cost=0.45..2.06 rows=4 width=8) (actual time=0.000..0.000 rows=0 loops=0)
                                                                         I/O Timings: read=0.000 write=0.000
                                                                         ->  HashAggregate  (cost=0.02..0.03 rows=1 width=4) (actual time=0.000..0.000 rows=0 loops=0)
                                                                               Group Key: namespaces_5.id
                                                                               I/O Timings: read=0.000 write=0.000
                                                                               ->  CTE Scan on direct_groups namespaces_5  (cost=0.00..0.02 rows=1 width=4) (actual time=0.000..0.000 rows=0 loops=0)
                                                                                     Filter: ((namespaces_5.type)::text = 'Group'::text)
                                                                                     Rows Removed by Filter: 0
                                                                                     I/O Timings: read=0.000 write=0.000
                                                                         ->  Index Only Scan using index_group_group_links_on_shared_with_group_and_shared_group on public.group_group_links group_group_links_1  (cost=0.42..1.99 rows=4 width=16) (actual time=0.000..0.000 rows=0 loops=0)
                                                                               Index Cond: (group_group_links_1.shared_with_group_id = namespaces_5.id)
                                                                               Heap Fetches: 0
                                                                               I/O Timings: read=0.000 write=0.000
                                                                   ->  Index Scan using namespaces_pkey on public.namespaces namespaces_4  (cost=0.57..3.08 rows=1 width=32) (actual time=0.000..0.000 rows=0 loops=0)
                                                                         Index Cond: (namespaces_4.id = group_group_links_1.shared_group_id)
                                                                         Filter: ((namespaces_4.type)::text = 'Group'::text)
                                                                         Rows Removed by Filter: 0
                                                                         I/O Timings: read=0.000 write=0.000
                                                           ->  Sort  (cost=3.93..3.93 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
                                                                 Sort Key: namespaces_9.name, namespaces_9.path, namespaces_9.owner_id, namespaces_9.created_at, namespaces_9.updated_at, namespaces_9.avatar, namespaces_9.membership_lock, namespaces_9.share_with_group_lock, namespaces_9.visibility_level, namespaces_9.request_access_enabled, namespaces_9.ldap_sync_status, namespaces_9.ldap_sync_error, namespaces_9.ldap_sync_last_update_at, namespaces_9.ldap_sync_last_successful_update_at, namespaces_9.ldap_sync_last_sync_at, namespaces_9.lfs_enabled, namespaces_9.parent_id, namespaces_9.shared_runners_minutes_limit, namespaces_9.repository_size_limit, namespaces_9.require_two_factor_authentication, namespaces_9.two_factor_grace_period, namespaces_9.project_creation_level, namespaces_9.runners_token, namespaces_9.file_template_project_id, namespaces_9.saml_discovery_token, namespaces_9.runners_token_encrypted, namespaces_9.custom_project_templates_group_id, namespaces_9.auto_devops_enabled, namespaces_9.extra_shared_runners_minutes_limit, namespaces_9.last_ci_minutes_notification_at, namespaces_9.last_ci_minutes_usage_notification_level, namespaces_9.subgroup_creation_level, namespaces_9.max_pages_size, namespaces_9.max_artifacts_size, namespaces_9.mentions_disabled, namespaces_9.default_branch_protection, namespaces_9.max_personal_access_token_lifetime, namespaces_9.push_rule_id, namespaces_9.shared_runners_enabled, namespaces_9.allow_descendants_override_disabled_shared_runners, namespaces_9.traversal_ids, namespaces_9.organization_id
                                                                 I/O Timings: read=0.000 write=0.000
                                                                 ->  Nested Loop  (cost=0.57..3.92 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
                                                                       I/O Timings: read=0.000 write=0.000
                                                                       ->  Nested Loop Anti Join  (cost=0.00..0.07 rows=1 width=32) (actual time=0.000..0.000 rows=0 loops=0)
                                                                             I/O Timings: read=0.000 write=0.000
                                                                             ->  CTE Scan on descendants_base_cte d1_1  (cost=0.00..0.02 rows=1 width=36) (actual time=0.000..0.000 rows=0 loops=0)
                                                                                   I/O Timings: read=0.000 write=0.000
                                                                             ->  CTE Scan on descendants_base_cte d2_1  (cost=0.00..0.02 rows=1 width=4) (actual time=0.000..0.000 rows=0 loops=0)
                                                                                   I/O Timings: read=0.000 write=0.000
                                                                       ->  Index Scan using index_namespaces_on_type_and_id on public.namespaces namespaces_9  (cost=0.57..3.59 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
                                                                             Index Cond: (((namespaces_9.type)::text = 'Group'::text) AND (namespaces_9.id = namespaces.id))
                                                                             I/O Timings: read=0.000 write=0.000
                                         ->  Nested Loop  (cost=1.70..14.49 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
                                               I/O Timings: read=0.000 write=0.000
                                               ->  Nested Loop Semi Join  (cost=1.14..10.89 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
                                                     I/O Timings: read=0.000 write=0.000
                                                     ->  Index Scan using index_namespaces_on_type_and_id on public.namespaces namespaces_10  (cost=0.57..3.59 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
                                                           Index Cond: (((namespaces_10.type)::text = 'Group'::text) AND (namespaces_10.id = namespaces.id))
                                                           I/O Timings: read=0.000 write=0.000
                                                     ->  Nested Loop  (cost=0.57..7.29 rows=1 width=4) (actual time=0.000..0.000 rows=0 loops=0)
                                                           I/O Timings: read=0.000 write=0.000
                                                           ->  Index Scan using index_gitlab_subscriptions_on_namespace_id on public.gitlab_subscriptions  (cost=0.43..3.45 rows=1 width=8) (actual time=0.000..0.000 rows=0 loops=0)
                                                                 Index Cond: (gitlab_subscriptions.namespace_id = namespaces.id)
                                                                 I/O Timings: read=0.000 write=0.000
                                                           ->  Index Scan using plans_pkey on public.plans  (cost=0.14..3.16 rows=1 width=4) (actual time=0.000..0.000 rows=0 loops=0)
                                                                 Index Cond: (plans.id = gitlab_subscriptions.hosted_plan_id)
                                                                 Filter: ((plans.name)::text = ANY ('{silver,premium,premium_trial,gold,ultimate,ultimate_trial,ultimate_trial_paid_customer,opensource}'::text[]))
                                                                 Rows Removed by Filter: 0
                                                                 I/O Timings: read=0.000 write=0.000
                                               ->  Index Scan using index_members_on_source_and_type_and_access_level on public.members members_1  (cost=0.56..3.59 rows=1 width=4) (actual time=0.000..0.000 rows=0 loops=0)
                                                     Index Cond: ((members_1.source_id = namespaces.id) AND ((members_1.source_type)::text = 'Namespace'::text) AND ((members_1.type)::text = 'GroupMember'::text) AND (members_1.access_level = 5))
                                                     Filter: (members_1.user_id = 1)
                                                     Rows Removed by Filter: 0
                                                     I/O Timings: read=0.000 write=0.000
Settings: random_page_cost = '1.5', seq_page_cost = '4', effective_cache_size = '472585MB', jit = 'off', work_mem = '100MB'

How to set up and validate locally

  1. Go to a group -> Manage -> Members
  2. Click Invite a group
  3. Choose a group and invite
  4. Make note of the group's path
  5. Go to /-/graphql-explorer
  6. Run the following query
{
  group(fullPath: "gitlab-org") {
    sharedGroups {
      nodes {
        id
        fullName
      }
      count
    }
  }
}

MR acceptance checklist

Evaluate this MR against the MR acceptance checklist. It helps you analyze changes to reduce risks in quality, performance, reliability, security, and maintainability.

Edited by Peter Hegman

Merge request reports

Loading