Skip to content

Listing user activity can take more than 15s

Meta issue: https://gitlab.com/gitlab-org/gitlab-ce/issues/40522

Sentry: https://sentry.gitlap.com/gitlab/gitlabcom/issues/110395/

Query:

SELECT  
  "events"."id" AS t0_r0,
  "events"."project_id" AS t0_r1,
  "events"."author_id" AS t0_r2,
  "events"."target_id" AS t0_r3,
  "events"."created_at" AS t0_r4,
  "events"."updated_at" AS t0_r5,
  "events"."action" AS t0_r6,
  "events"."target_type" AS t0_r7,
  "users"."id" AS t1_r0,
  "users"."email" AS t1_r1,
  "users"."encrypted_password" AS t1_r2,
  "users"."reset_password_token" AS t1_r3,
  "users"."reset_password_sent_at" AS t1_r4,
  "users"."remember_created_at" AS t1_r5,
  "users"."sign_in_count" AS t1_r6,
  "users"."current_sign_in_at" AS t1_r7,
  "users"."last_sign_in_at" AS t1_r8,
  "users"."current_sign_in_ip" AS t1_r9,
  "users"."last_sign_in_ip" AS t1_r10,
  "users"."created_at" AS t1_r11,
  "users"."updated_at" AS t1_r12,
  "users"."name" AS t1_r13,
  "users"."admin" AS t1_r14,
  "users"."projects_limit" AS t1_r15,
  "users"."skype" AS t1_r16,
  "users"."linkedin" AS t1_r17,
  "users"."twitter" AS t1_r18,
  "users"."bio" AS t1_r19,
  "users"."failed_attempts" AS t1_r20,
  "users"."locked_at" AS t1_r21,
  "users"."username" AS t1_r22,
  "users"."can_create_group" AS t1_r23,
  "users"."can_create_team" AS t1_r24,
  "users"."state" AS t1_r25,
  "users"."color_scheme_id" AS t1_r26,
  "users"."password_expires_at" AS t1_r27,
  "users"."created_by_id" AS t1_r28,
  "users"."avatar" AS t1_r29,
  "users"."confirmation_token" AS t1_r30,
  "users"."confirmed_at" AS t1_r31,
  "users"."confirmation_sent_at" AS t1_r32,
  "users"."unconfirmed_email" AS t1_r33,
  "users"."hide_no_ssh_key" AS t1_r34,
  "users"."website_url" AS t1_r35,
  "users"."last_credential_check_at" AS t1_r36,
  "users"."admin_email_unsubscribed_at" AS t1_r37,
  "users"."notification_email" AS t1_r38,
  "users"."hide_no_password" AS t1_r39,
  "users"."password_automatically_set" AS t1_r40,
  "users"."location" AS t1_r41,
  "users"."public_email" AS t1_r42,
  "users"."encrypted_otp_secret" AS t1_r43,
  "users"."encrypted_otp_secret_iv" AS t1_r44,
  "users"."encrypted_otp_secret_salt" AS t1_r45,
  "users"."otp_required_for_login" AS t1_r46,
  "users"."otp_backup_codes" AS t1_r47,
  "users"."dashboard" AS t1_r48,
  "users"."project_view" AS t1_r49,
  "users"."consumed_timestep" AS t1_r50,
  "users"."layout" AS t1_r51,
  "users"."hide_project_limit" AS t1_r52,
  "users"."unlock_token" AS t1_r53,
  "users"."note" AS t1_r54,
  "users"."otp_grace_period_started_at" AS t1_r55,
  "users"."external" AS t1_r56,
  "users"."organization" AS t1_r57,
  "users"."incoming_email_token" AS t1_r58,
  "users"."auditor" AS t1_r59,
  "users"."ghost" AS t1_r60,
  "users"."require_two_factor_authentication_from_group" AS t1_r61,
  "users"."two_factor_grace_period" AS t1_r62,
  "users"."notified_of_own_activity" AS t1_r63,
  "users"."support_bot" AS t1_r64,
  "users"."last_activity_on" AS t1_r65,
  "users"."preferred_language" AS t1_r66,
  "users"."rss_token" AS t1_r67,
  "users"."email_opted_in" AS t1_r68,
  "users"."email_opted_in_ip" AS t1_r69,
  "users"."email_opted_in_source_id" AS t1_r70,
  "users"."email_opted_in_at" AS t1_r71,
  "users"."theme_id" AS t1_r72,
  "projects"."id" AS t2_r0,
  "projects"."name" AS t2_r1,
  "projects"."path" AS t2_r2,
  "projects"."description" AS t2_r3,
  "projects"."created_at" AS t2_r4,
  "projects"."updated_at" AS t2_r5,
  "projects"."creator_id" AS t2_r6,
  "projects"."namespace_id" AS t2_r7,
  "projects"."last_activity_at" AS t2_r8,
  "projects"."import_url" AS t2_r9,
  "projects"."visibility_level" AS t2_r10,
  "projects"."archived" AS t2_r11,
  "projects"."import_status" AS t2_r12,
  "projects"."merge_requests_template" AS t2_r13,
  "projects"."star_count" AS t2_r14,
  "projects"."merge_requests_rebase_enabled" AS t2_r15,
  "projects"."import_type" AS t2_r16,
  "projects"."import_source" AS t2_r17,
  "projects"."avatar" AS t2_r18,
  "projects"."approvals_before_merge" AS t2_r19,
  "projects"."reset_approvals_on_push" AS t2_r20,
  "projects"."merge_requests_ff_only_enabled" AS t2_r21,
  "projects"."issues_template" AS t2_r22,
  "projects"."mirror" AS t2_r23,
  "projects"."mirror_last_update_at" AS t2_r24,
  "projects"."mirror_last_successful_update_at" AS t2_r25,
  "projects"."mirror_user_id" AS t2_r26,
  "projects"."import_error" AS t2_r27,
  "projects"."ci_id" AS t2_r28,
  "projects"."shared_runners_enabled" AS t2_r29,
  "projects"."runners_token" AS t2_r30,
  "projects"."build_coverage_regex" AS t2_r31,
  "projects"."build_allow_git_fetch" AS t2_r32,
  "projects"."build_timeout" AS t2_r33,
  "projects"."mirror_trigger_builds" AS t2_r34,
  "projects"."public_builds" AS t2_r35,
  "projects"."pending_delete" AS t2_r36,
  "projects"."last_repository_check_failed" AS t2_r37,
  "projects"."last_repository_check_at" AS t2_r38,
  "projects"."container_registry_enabled" AS t2_r39,
  "projects"."only_allow_merge_if_pipeline_succeeds" AS t2_r40,
  "projects"."has_external_issue_tracker" AS t2_r41,
  "projects"."repository_storage" AS t2_r42,
  "projects"."request_access_enabled" AS t2_r43,
  "projects"."has_external_wiki" AS t2_r44,
  "projects"."repository_read_only" AS t2_r45,
  "projects"."lfs_enabled" AS t2_r46,
  "projects"."description_html" AS t2_r47,
  "projects"."only_allow_merge_if_all_discussions_are_resolved" AS t2_r48,
  "projects"."repository_size_limit" AS t2_r49,
  "projects"."service_desk_enabled" AS t2_r50,
  "projects"."printing_merge_request_link_enabled" AS t2_r51,
  "projects"."auto_cancel_pending_pipelines" AS t2_r52,
  "projects"."import_jid" AS t2_r53,
  "projects"."cached_markdown_version" AS t2_r54,
  "projects"."last_repository_updated_at" AS t2_r55,
  "projects"."ci_config_path" AS t2_r56,
  "projects"."disable_overriding_approvers_per_merge_request" AS t2_r57,
  "projects"."delete_error" AS t2_r58,
  "projects"."storage_version" AS t2_r59,
  "projects"."resolve_outdated_diff_discussions" AS t2_r60,
  "projects"."remote_mirror_available_overridden" AS t2_r61,
  "namespaces"."id" AS t3_r0,
  "namespaces"."name" AS t3_r1,
  "namespaces"."path" AS t3_r2,
  "namespaces"."owner_id" AS t3_r3,
  "namespaces"."created_at" AS t3_r4,
  "namespaces"."updated_at" AS t3_r5,
  "namespaces"."type" AS t3_r6,
  "namespaces"."description" AS t3_r7,
  "namespaces"."avatar" AS t3_r8,
  "namespaces"."membership_lock" AS t3_r9,
  "namespaces"."share_with_group_lock" AS t3_r10,
  "namespaces"."visibility_level" AS t3_r11,
  "namespaces"."request_access_enabled" AS t3_r12,
  "namespaces"."ldap_sync_status" AS t3_r13,
  "namespaces"."ldap_sync_error" AS t3_r14,
  "namespaces"."ldap_sync_last_update_at" AS t3_r15,
  "namespaces"."ldap_sync_last_successful_update_at" AS t3_r16,
  "namespaces"."ldap_sync_last_sync_at" AS t3_r17,
  "namespaces"."deleted_at" AS t3_r18,
  "namespaces"."lfs_enabled" AS t3_r19,
  "namespaces"."description_html" AS t3_r20,
  "namespaces"."parent_id" AS t3_r21,
  "namespaces"."shared_runners_minutes_limit" AS t3_r22,
  "namespaces"."repository_size_limit" AS t3_r23,
  "namespaces"."require_two_factor_authentication" AS t3_r24,
  "namespaces"."two_factor_grace_period" AS t3_r25,
  "namespaces"."cached_markdown_version" AS t3_r26,
  "namespaces"."plan_id" AS t3_r27 
FROM "events" 
LEFT OUTER JOIN "users" ON "users"."id" = "events"."author_id" 
LEFT OUTER JOIN "projects" ON "projects"."id" = "events"."project_id" 
LEFT OUTER JOIN "namespaces" ON "namespaces"."id" = "projects"."namespace_id" 
WHERE "events"."author_id" = :profile_user_id
AND (
  EXISTS (
    SELECT 1 
    FROM "project_authorizations" 
    WHERE "project_authorizations"."user_id" = :current_user_id 
    AND (project_authorizations.project_id = projects.id)
  ) 
  OR projects.visibility_level IN (10,20)
)
ORDER BY "events"."id" DESC 
LIMIT 20 OFFSET 0

EXPLAIN ANALYZE: https://explain.depesz.com/s/MGaz (where 111111 is the profile_user_id, and 999999 is the current_user_id)

Planning time: 2.290 ms

Execution time: 37153.404 ms

Edited by Douwe Maan