Skip to content

Simplify projects, merge requests search queries

M. Hasbini requested to merge 0xbsec/gitlab-ce:22145-slow-search into master

What does this MR do?

Simplify projects, merge requests search queries to improve performance (or worsen in some cases, please check the benchmark below) by removing unnecessary/duplicates conditions.

Example: As an admin and I search for gitlab.

That's the generated count project query (explain):

SELECT COUNT(*)
FROM "projects"
WHERE "projects"."pending_delete" = 'f'
  AND (projects.id IN
         (SELECT "projects"."id"
          FROM "projects"
          INNER JOIN "project_authorizations" ON "projects"."id" = "project_authorizations"."project_id"
          WHERE "projects"."pending_delete" = 'f'
            AND "project_authorizations"."user_id" = 1
          UNION SELECT "projects"."id"
          FROM "projects"))
  AND (projects.id IN
         (SELECT "projects"."id"
          FROM "projects"
          WHERE "projects"."pending_delete" = 'f'
            AND (projects.id IN
                   (SELECT "projects"."id"
                    FROM "projects"
                    INNER JOIN "project_authorizations" ON "projects"."id" = "project_authorizations"."project_id"
                    WHERE "projects"."pending_delete" = 'f'
                      AND "project_authorizations"."user_id" = 1
                    UNION SELECT "projects"."id"
                    FROM "projects"))
            AND (("projects"."path" ILIKE '%%%{query}%%'
                  OR "projects"."name" ILIKE '%%%{query}%%')
                 OR "projects"."description" ILIKE '%%%{query}%%')
          UNION SELECT "projects"."id"
          FROM "projects"
          INNER JOIN "namespaces" ON "namespaces"."id" = "projects"."namespace_id"
          AND "namespaces"."deleted_at" IS NULL
          WHERE "projects"."pending_delete" = 'f'
            AND (projects.id IN
                   (SELECT "projects"."id"
                    FROM "projects"
                    INNER JOIN "project_authorizations" ON "projects"."id" = "project_authorizations"."project_id"
                    WHERE "projects"."pending_delete" = 'f'
                      AND "project_authorizations"."user_id" = 1
                    UNION SELECT "projects"."id"
                    FROM "projects"))
            AND ("namespaces"."name" ILIKE '%%%{query}%%')))

Which have the inner join with authorizations and pending_delete check repeated multiple times between AND operator:

INNER JOIN "project_authorizations" ON "projects"."id" = "project_authorizations"."project_id"
WHERE "projects"."pending_delete" = 'f'
AND "project_authorizations"."user_id" = 1
UNION SELECT "projects"."id"
FROM "projects"

By removing the duplicate checks we end up with this query (explain):

SELECT COUNT(*)
FROM "projects"
WHERE "projects"."pending_delete" = 'f'
  AND (projects.id IN
         (SELECT "projects"."id"
          FROM "projects"
          INNER JOIN "project_authorizations" ON "projects"."id" = "project_authorizations"."project_id"
          WHERE "projects"."pending_delete" = 'f'
            AND "project_authorizations"."user_id" = 1
          UNION SELECT "projects"."id"
          FROM "projects"))
  AND (projects.id IN
         (SELECT "projects"."id"
          FROM "projects"
          WHERE (("projects"."path" ILIKE '%%%{query}%%'
                  OR "projects"."name" ILIKE '%%%{query}%%')
                 OR "projects"."description" ILIKE '%%%{query}%%')
          UNION SELECT "projects"."id"
          FROM "projects"
          INNER JOIN "namespaces" ON "namespaces"."id" = "projects"."namespace_id"
          AND "namespaces"."deleted_at" IS NULL
          WHERE ("namespaces"."name" ILIKE '%%%{query}%%')))

The same apply for the generated merge request count query (explain):

SELECT COUNT(*)
FROM "merge_requests"
INNER JOIN "projects" ON "projects"."id" = "merge_requests"."target_project_id"
AND "projects"."pending_delete" = 'f'
LEFT JOIN project_features ON projects.id = project_features.project_id
WHERE "merge_requests"."deleted_at" IS NULL
  AND "projects"."pending_delete" = 'f'
  AND (projects.id IN
         (SELECT "projects"."id"
          FROM "projects"
          INNER JOIN "project_authorizations" ON "projects"."id" = "project_authorizations"."project_id"
          WHERE "projects"."pending_delete" = 'f'
            AND "project_authorizations"."user_id" = 1
            AND "projects"."id" IN
              (SELECT "merge_requests"."target_project_id"
               FROM "merge_requests"
               WHERE "merge_requests"."deleted_at" IS NULL)
          UNION SELECT "projects"."id"
          FROM "projects"
          WHERE "projects"."id" IN
              (SELECT "merge_requests"."target_project_id"
               FROM "merge_requests"
               WHERE "merge_requests"."deleted_at" IS NULL)))
  AND ("project_features"."merge_requests_access_level" IN (10,
                                                            20)
       OR "project_features"."merge_requests_access_level" IS NULL)
  AND (merge_requests.id IN
         (SELECT "merge_requests"."id"
          FROM "merge_requests"
          INNER JOIN "projects" ON "projects"."id" = "merge_requests"."target_project_id"
          AND "projects"."pending_delete" = 'f'
          LEFT JOIN project_features ON projects.id = project_features.project_id
          WHERE "merge_requests"."deleted_at" IS NULL
            AND "projects"."pending_delete" = 'f'
            AND (projects.id IN
                   (SELECT "projects"."id"
                    FROM "projects"
                    INNER JOIN "project_authorizations" ON "projects"."id" = "project_authorizations"."project_id"
                    WHERE "projects"."pending_delete" = 'f'
                      AND "project_authorizations"."user_id" = 1
                      AND "projects"."id" IN
                        (SELECT "merge_requests"."target_project_id"
                         FROM "merge_requests"
                         WHERE "merge_requests"."deleted_at" IS NULL)
                    UNION SELECT "projects"."id"
                    FROM "projects"
                    WHERE "projects"."id" IN
                        (SELECT "merge_requests"."target_project_id"
                         FROM "merge_requests"
                         WHERE "merge_requests"."deleted_at" IS NULL)))
            AND ("project_features"."merge_requests_access_level" IN (10,
                                                                      20)
                 OR "project_features"."merge_requests_access_level" IS NULL)
            AND "merge_requests"."source_project_id" IN
              (SELECT "projects"."id"
               FROM "projects"
               WHERE "projects"."pending_delete" = 'f'
                 AND (projects.id IN
                        (SELECT "projects"."id"
                         FROM "projects"
                         INNER JOIN "project_authorizations" ON "projects"."id" = "project_authorizations"."project_id"
                         WHERE "projects"."pending_delete" = 'f'
                           AND "project_authorizations"."user_id" = 1
                         UNION SELECT "projects"."id"
                         FROM "projects")))
          UNION SELECT "merge_requests"."id"
          FROM "merge_requests"
          INNER JOIN "projects" ON "projects"."id" = "merge_requests"."target_project_id"
          AND "projects"."pending_delete" = 'f'
          LEFT JOIN project_features ON projects.id = project_features.project_id
          WHERE "merge_requests"."deleted_at" IS NULL
            AND "projects"."pending_delete" = 'f'
            AND (projects.id IN
                   (SELECT "projects"."id"
                    FROM "projects"
                    INNER JOIN "project_authorizations" ON "projects"."id" = "project_authorizations"."project_id"
                    WHERE "projects"."pending_delete" = 'f'
                      AND "project_authorizations"."user_id" = 1
                      AND "projects"."id" IN
                        (SELECT "merge_requests"."target_project_id"
                         FROM "merge_requests"
                         WHERE "merge_requests"."deleted_at" IS NULL)
                    UNION SELECT "projects"."id"
                    FROM "projects"
                    WHERE "projects"."id" IN
                        (SELECT "merge_requests"."target_project_id"
                         FROM "merge_requests"
                         WHERE "merge_requests"."deleted_at" IS NULL)))
            AND ("project_features"."merge_requests_access_level" IN (10,
                                                                      20)
                 OR "project_features"."merge_requests_access_level" IS NULL)
            AND "merge_requests"."target_project_id" IN
              (SELECT "projects"."id"
               FROM "projects"
               WHERE "projects"."pending_delete" = 'f'
                 AND (projects.id IN
                        (SELECT "projects"."id"
                         FROM "projects"
                         INNER JOIN "project_authorizations" ON "projects"."id" = "project_authorizations"."project_id"
                         WHERE "projects"."pending_delete" = 'f'
                           AND "project_authorizations"."user_id" = 1
                         UNION SELECT "projects"."id"
                         FROM "projects")))))
  AND ("merge_requests"."title" ILIKE '%%%{query}%%'
       OR "merge_requests"."description" ILIKE '%%%{query}%%')

Repeated check:

INNER JOIN "projects" ON "projects"."id" = "merge_requests"."target_project_id"
AND "projects"."pending_delete" = 'f'
LEFT JOIN project_features ON projects.id = project_features.project_id
WHERE "merge_requests"."deleted_at" IS NULL
  AND "projects"."pending_delete" = 'f'
  AND (projects.id IN
         (SELECT "projects"."id"
          FROM "projects"
          INNER JOIN "project_authorizations" ON "projects"."id" = "project_authorizations"."project_id"
          WHERE "projects"."pending_delete" = 'f'
            AND "project_authorizations"."user_id" = 1
            AND "projects"."id" IN
              (SELECT "merge_requests"."target_project_id"
               FROM "merge_requests"
               WHERE "merge_requests"."deleted_at" IS NULL)
          UNION SELECT "projects"."id"
          FROM "projects"
          WHERE "projects"."id" IN
              (SELECT "merge_requests"."target_project_id"
               FROM "merge_requests"
               WHERE "merge_requests"."deleted_at" IS NULL)))
  AND ("project_features"."merge_requests_access_level" IN (10,
                                                            20)
       OR "project_features"."merge_requests_access_level" IS NULL)

Updated query (explain):

SELECT COUNT(*)
FROM "merge_requests"
INNER JOIN "projects" ON "projects"."id" = "merge_requests"."target_project_id"
AND "projects"."pending_delete" = 'f'
LEFT JOIN project_features ON projects.id = project_features.project_id
WHERE "merge_requests"."deleted_at" IS NULL
  AND "projects"."pending_delete" = 'f'
  AND (projects.id IN
         (SELECT "projects"."id"
          FROM "projects"
          INNER JOIN "project_authorizations" ON "projects"."id" = "project_authorizations"."project_id"
          WHERE "projects"."pending_delete" = 'f'
            AND "project_authorizations"."user_id" = 1
            AND "projects"."id" IN
              (SELECT "merge_requests"."target_project_id"
               FROM "merge_requests"
               WHERE "merge_requests"."deleted_at" IS NULL)
          UNION SELECT "projects"."id"
          FROM "projects"
          WHERE "projects"."id" IN
              (SELECT "merge_requests"."target_project_id"
               FROM "merge_requests"
               WHERE "merge_requests"."deleted_at" IS NULL)))
  AND ("project_features"."merge_requests_access_level" IN (10,
                                                            20)
       OR "project_features"."merge_requests_access_level" IS NULL)
  AND (merge_requests.id IN
         (SELECT "merge_requests"."id"
          FROM "merge_requests"
          WHERE "merge_requests"."source_project_id" IN
              (SELECT "projects"."id"
               FROM "projects"
               WHERE "projects"."pending_delete" = 'f'
                 AND (projects.id IN
                        (SELECT "projects"."id"
                         FROM "projects"
                         INNER JOIN "project_authorizations" ON "projects"."id" = "project_authorizations"."project_id"
                         WHERE "projects"."pending_delete" = 'f'
                           AND "project_authorizations"."user_id" = 1
                         UNION SELECT "projects"."id"
                         FROM "projects")))
          UNION SELECT "merge_requests"."id"
          FROM "merge_requests"
          WHERE "merge_requests"."target_project_id" IN
              (SELECT "projects"."id"
               FROM "projects"
               WHERE "projects"."pending_delete" = 'f'
                 AND (projects.id IN
                        (SELECT "projects"."id"
                         FROM "projects"
                         INNER JOIN "project_authorizations" ON "projects"."id" = "project_authorizations"."project_id"
                         WHERE "projects"."pending_delete" = 'f'
                           AND "project_authorizations"."user_id" = 1
                         UNION SELECT "projects"."id"
                         FROM "projects")))))
  AND ("merge_requests"."title" ILIKE '%%%{query}%%'
       OR "merge_requests"."description" ILIKE '%%%{query}%%')

Measuring queries execution time

I've measured the time taken to execute the count for these scenarios: user is admin, normal, anonymous between the original and the updated queries, for different search inputs (based on the generated seed data), using this script.

$ rails runner /tmp/bench.rb
                                                            user     system      total        real
anonymouse - projects count - all - original				    0.000000   0.000000   0.000000 (  7.935031)
anonymouse - projects count - all - updated				      0.010000   0.000000   0.010000 (  8.705326)
                                                            user     system      total        real
anonymouse - projects count - projects - original				0.000000   0.000000   0.000000 (  7.947350)
anonymouse - projects count - projects - updated				0.000000   0.010000   0.010000 (  8.815746)
                                                            user     system      total        real
anonymouse - projects count - mrs - original				    0.000000   0.000000   0.000000 (  3.194203)
anonymouse - projects count - mrs - updated				      0.000000   0.000000   0.000000 (  3.523315)
                                                            user     system      total        real
anonymouse - projects count - partial - original				0.000000   0.000000   0.000000 (  0.003624)
anonymouse - projects count - partial - updated				  0.000000   0.000000   0.000000 (  0.003340)
                                                            user     system      total        real
normal_user - projects count - nan - original				    0.000000   0.000000   0.000000 (  9.032061)
normal_user - projects count - nan - updated				    0.000000   0.000000   0.000000 (  0.005990)
                                                            user     system      total        real
normal_user - projects count - all - original				    0.000000   0.000000   0.000000 ( 22.455214)
normal_user - projects count - all - updated				    0.000000   0.000000   0.000000 ( 14.136155)
                                                            user     system      total        real
normal_user - projects count - projects - original			0.000000   0.000000   0.000000 ( 22.678957)
normal_user - projects count - projects - updated				0.000000   0.000000   0.000000 ( 14.282730)
                                                            user     system      total        real
normal_user - projects count - mrs - original				    0.000000   0.000000   0.000000 (  9.938968)
normal_user - projects count - mrs - updated				    0.000000   0.000000   0.000000 (  3.451191)
                                                            user     system      total        real
normal_user - projects count - partial - original				0.000000   0.000000   0.000000 ( 10.382427)
normal_user - projects count - partial - updated				0.000000   0.000000   0.000000 (  4.448506)
                                                            user     system      total        real
admin - projects count - nan - original				          0.000000   0.000000   0.000000 (  9.140858)
admin - projects count - nan - updated				          0.000000   0.000000   0.000000 (  0.005978)
                                                            user     system      total        real
admin - projects count - all - original				          0.000000   0.000000   0.000000 ( 24.643975)
admin - projects count - all - updated				          0.000000   0.000000   0.000000 ( 14.928272)
                                                            user     system      total        real
admin - projects count - projects - original				    0.000000   0.000000   0.000000 ( 24.744944)
admin - projects count - projects - updated				      0.000000   0.000000   0.000000 ( 15.155386)
                                                            user     system      total        real
admin - projects count - mrs - original				          0.000000   0.000000   0.000000 (  9.858695)
admin - projects count - mrs - updated				          0.000000   0.000000   0.000000 (  3.437140)
                                                            user     system      total        real
admin - projects count - partial - original				      0.000000   0.000000   0.000000 ( 10.679047)
admin - projects count - partial - updated				      0.000000   0.000000   0.000000 (  3.037710)
                                                            user     system      total        real
anonymouse - mrs count - nan - original				          0.000000   0.000000   0.000000 (  0.005399)
anonymouse - mrs count - nan - updated				          0.000000   0.000000   0.000000 (  3.568246)
                                                            user     system      total        real
anonymouse - mrs count - all - original				          0.000000   0.000000   0.000000 ( 11.683208)
anonymouse - mrs count - all - updated				          0.000000   0.000000   0.000000 (  8.835920)
                                                            user     system      total        real
anonymouse - mrs count - projects - original				    0.000000   0.000000   0.000000 (  0.003712)
anonymouse - mrs count - projects - updated				      0.000000   0.000000   0.000000 (  3.584386)
                                                            user     system      total        real
anonymouse - mrs count - mrs - original				          0.000000   0.000000   0.000000 ( 11.888238)
anonymouse - mrs count - mrs - updated				          0.000000   0.000000   0.000000 (  8.726474)
                                                            user     system      total        real
anonymouse - mrs count - partial - original				      0.000000   0.000000   0.000000 (  0.005648)
anonymouse - mrs count - partial - updated				      0.000000   0.000000   0.000000 (  3.545526)
                                                            user     system      total        real
normal_user - mrs count - nan - original				        0.000000   0.000000   0.000000 ( 45.966391)
normal_user - mrs count - nan - updated				          0.000000   0.000000   0.000000 ( 21.198180)
                                                            user     system      total        real
normal_user - mrs count - all - original				        0.000000   0.000000   0.000000 ( 48.620634)
normal_user - mrs count - all - updated				          0.000000   0.000000   0.000000 ( 23.351577)
                                                            user     system      total        real
normal_user - mrs count - projects - original				    0.000000   0.000000   0.000000 ( 45.930244)
normal_user - mrs count - projects - updated				    0.000000   0.000000   0.000000 ( 21.660498)
                                                            user     system      total        real
normal_user - mrs count - mrs - original				        0.000000   0.000000   0.000000 ( 51.005810)
normal_user - mrs count - mrs - updated				          0.000000   0.000000   0.000000 ( 26.630592)
                                                            user     system      total        real
normal_user - mrs count - partial - original				    0.000000   0.000000   0.000000 ( 49.360946)
normal_user - mrs count - partial - updated				      0.000000   0.000000   0.000000 ( 24.454520)
                                                            user     system      total        real
admin - mrs count - nan - original				              0.000000   0.000000   0.000000 ( 32.056543)
admin - mrs count - nan - updated				                0.000000   0.000000   0.000000 ( 19.735311)
                                                            user     system      total        real
admin - mrs count - all - original				              0.000000   0.000000   0.000000 ( 38.085343)
admin - mrs count - all - updated				                0.000000   0.000000   0.000000 ( 26.390205)
                                                            user     system      total        real
admin - mrs count - projects - original				          0.000000   0.000000   0.000000 ( 30.831322)
admin - mrs count - projects - updated				          0.000000   0.000000   0.000000 ( 19.820861)
                                                            user     system      total        real
admin - mrs count - mrs - original				              0.000000   0.000000   0.000000 ( 39.897301)
admin - mrs count - mrs - updated				                0.000000   0.000000   0.000000 ( 26.183525)
                                                            user     system      total        real
admin - mrs count - partial - original				          0.000000   0.000000   0.000000 ( 32.068286)
admin - mrs count - partial - updated				            0.000000   0.000000   0.000000 ( 20.092063)

Seed data

The seed data was generated using @jamedjo's https://gitlab.com/gitlab-org/gitlab-ce/snippets/33946 ( some were executed more than once with different text):

Project.insert_using_generate_series(1, 1500000) do |sql|
  project_name = raw("'seed_project_' || seq")
  sql.name = project_name
  sql.path = project_name
  sql.creator_id = author.id
  sql.namespace_id = author.namespace_id
  # sql.visibility_level = 20
end

  Issue.insert_using_generate_series(1, 1500000) do |sql|
    text = raw("'seed_issue2_' || seq")
    sql.title = text
    sql.description = text
    sql.author_id = author.id
    sql.project_id = raw("seq")
  end


  MergeRequest.insert_using_generate_series(1, 1500000) do |sql|
    target = raw("'seed_mr_target' || seq")
    source = raw("'seed_mr_source' || seq")
    sql.target_branch = target
    sql.source_branch = source
    sql.title = target
    sql.author_id = author.id
    sql.target_project_id = raw("seq")
    sql.source_project_id = raw("seq")
  end

  Milestone.insert_using_generate_series(1, 1500000) do |sql|
    sql.title = raw("'seed_ms' || seq")
    sql.project_id = raw("seq")
  end

Going by the report, the only queries which are faster in the original version are:

                                                            user     system      total        real
anonymouse - projects count - all - original				    0.000000   0.000000   0.000000 (  7.935031)
anonymouse - projects count - all - updated				      0.010000   0.000000   0.010000 (  8.705326)
                                                            user     system      total        real
anonymouse - projects count - projects - original				0.000000   0.000000   0.000000 (  7.947350)
anonymouse - projects count - projects - updated				0.000000   0.010000   0.010000 (  8.815746)
                                                            user     system      total        real
anonymouse - projects count - mrs - original				    0.000000   0.000000   0.000000 (  3.194203)
anonymouse - projects count - mrs - updated				      0.000000   0.000000   0.000000 (  3.523315)

anonymouse - mrs count - nan - original				          0.000000   0.000000   0.000000 (  0.005399)
anonymouse - mrs count - nan - updated				          0.000000   0.000000   0.000000 (  3.568246)
                                                            user     system      total        real
anonymouse - mrs count - all - original				          0.000000   0.000000   0.000000 ( 11.683208)
anonymouse - mrs count - all - updated				          0.000000   0.000000   0.000000 (  8.835920)
                                                            user     system      total        real
anonymouse - mrs count - projects - original				    0.000000   0.000000   0.000000 (  0.003712)
anonymouse - mrs count - projects - updated				      0.000000   0.000000   0.000000 (  3.584386)
                                                            user     system      total        real
anonymouse - mrs count - partial - original				      0.000000   0.000000   0.000000 (  0.005648)
anonymouse - mrs count - partial - updated				      0.000000   0.000000   0.000000 (  3.545526)

I'll investigate the reason, but I think it's because of early return in the original queries ( maybe the seeded data also affect the result ).

Update

Look like the reason for the huge difference between the updated version and the original in the cases bellow was because I didn't populate project_feature - each newly created project have a row in this table http://gitlab.com/0xbsec/gitlab-ce/blob/22145-slow-search/app/models/project.rb#L46 -

anonymouse - mrs count - nan - original				          0.000000   0.000000   0.000000 (  0.005399)
anonymouse - mrs count - nan - updated				          0.000000   0.000000   0.000000 (  3.568246)

anonymouse - mrs count - projects - original				    0.000000   0.000000   0.000000 (  0.003712)
anonymouse - mrs count - projects - updated				      0.000000   0.000000   0.000000 (  3.584386)

anonymouse - mrs count - partial - original				      0.000000   0.000000   0.000000 (  0.005648)
anonymouse - mrs count - partial - updated				      0.000000   0.000000   0.000000 (  3.545526)

I've used this query to populate project_feature:

INSERT INTO
  "project_features" ("created_at","updated_at","project_id","merge_requests_access_level","issues_access_level","wiki_access_level","snippets_access_level","builds_access_level","repository_access_level")
SELECT
  '2017-03-18 14:15:07.711928',
  '2017-03-18 14:15:07.711928',
  seq,
  20,
  20,
  20,
  20,
  20,
  20
FROM
  GENERATE_SERIES(1, 1000000, 1) AS "seq"
;

The updated report:

                                                         user     system      total        real
anonymouse - projects count - nan - original         0.000000   0.000000   0.000000 (  0.033167)
anonymouse - projects count - nan - updated          0.000000   0.000000   0.000000 (  0.016830)
                                                         user     system      total        real
anonymouse - projects count - all - original         0.010000   0.000000   0.010000 ( 14.901842)
anonymouse - projects count - all - updated          0.000000   0.000000   0.000000 ( 16.013438)
                                                         user     system      total        real
anonymouse - projects count - projects - original    0.000000   0.000000   0.000000 (  9.631885)
anonymouse - projects count - projects - updated     0.000000   0.000000   0.000000 ( 10.695942)
                                                         user     system      total        real
anonymouse - projects count - mrs - original         0.000000   0.000000   0.000000 ( 14.553725)
anonymouse - projects count - mrs - updated          0.000000   0.000000   0.000000 (  9.328919)
                                                         user     system      total        real
anonymouse - projects count - partial - original     0.000000   0.000000   0.000000 (  1.311471)
anonymouse - projects count - partial - updated      0.000000   0.000000   0.000000 (  0.951538)
                                                         user     system      total        real
normal_user - projects count - nan - original        0.000000   0.000000   0.000000 ( 10.049770)
normal_user - projects count - nan - updated         0.000000   0.000000   0.000000 (  0.015386)
                                                         user     system      total        real
normal_user - projects count - all - original        0.000000   0.000000   0.000000 ( 34.930586)
normal_user - projects count - all - updated         0.000000   0.000000   0.000000 ( 28.718161)
                                                         user     system      total        real
normal_user - projects count - projects - original   0.000000   0.000000   0.000000 ( 31.115940)
normal_user - projects count - projects - updated    0.000000   0.000000   0.000000 ( 16.147014)
                                                         user     system      total        real
normal_user - projects count - mrs - original        0.000000   0.000000   0.000000 ( 20.414610)
normal_user - projects count - mrs - updated         0.000000   0.000000   0.000000 (  9.569082)
                                                         user     system      total        real
normal_user - projects count - partial - original    0.000000   0.000000   0.000000 ( 13.225834)
normal_user - projects count - partial - updated     0.000000   0.000000   0.000000 (  6.014186)
                                                         user     system      total        real
admin - projects count - nan - original              0.000000   0.000000   0.000000 ( 10.517309)
admin - projects count - nan - updated               0.000000   0.000000   0.000000 (  0.016136)
                                                         user     system      total        real
admin - projects count - all - original              0.000000   0.000000   0.000000 ( 32.887341)
admin - projects count - all - updated               0.000000   0.000000   0.000000 ( 21.630579)
                                                         user     system      total        real
admin - projects count - projects - original         0.000000   0.000000   0.000000 ( 29.530870)
admin - projects count - projects - updated          0.000000   0.000000   0.000000 ( 14.944984)
                                                         user     system      total        real
admin - projects count - mrs - original              0.000000   0.010000   0.010000 ( 18.347696)
admin - projects count - mrs - updated               0.000000   0.000000   0.000000 (  8.932750)
                                                         user     system      total        real
admin - projects count - partial - original          0.000000   0.000000   0.000000 ( 12.646205)
admin - projects count - partial - updated           0.010000   0.000000   0.010000 (  5.840150)
                                                         user     system      total        real
anonymouse - mrs count - nan - original              0.000000   0.000000   0.000000 ( 13.065016)
anonymouse - mrs count - nan - updated               0.000000   0.000000   0.000000 (  4.905234)
                                                         user     system      total        real
anonymouse - mrs count - all - original              0.000000   0.000000   0.000000 ( 16.188468)
anonymouse - mrs count - all - updated               0.000000   0.000000   0.000000 (  7.366079)
                                                         user     system      total        real
anonymouse - mrs count - projects - original         0.000000   0.000000   0.000000 ( 12.515534)
anonymouse - mrs count - projects - updated          0.000000   0.000000   0.000000 (  3.753850)
                                                         user     system      total        real
anonymouse - mrs count - mrs - original              0.000000   0.000000   0.000000 ( 16.489345)
anonymouse - mrs count - mrs - updated               0.000000   0.000000   0.000000 (  7.155796)
                                                         user     system      total        real
anonymouse - mrs count - partial - original          0.000000   0.000000   0.000000 ( 12.479148)
anonymouse - mrs count - partial - updated           0.000000   0.000000   0.000000 (  3.570247)
                                                         user     system      total        real
normal_user - mrs count - nan - original             0.000000   0.000000   0.000000 ( 47.804503)
normal_user - mrs count - nan - updated              0.000000   0.000000   0.000000 ( 22.082809)
                                                         user     system      total        real
normal_user - mrs count - all - original             0.000000   0.000000   0.000000 ( 50.181626)
normal_user - mrs count - all - updated              0.000000   0.000000   0.000000 ( 24.127107)
                                                         user     system      total        real
normal_user - mrs count - projects - original        0.000000   0.000000   0.000000 ( 47.690195)
normal_user - mrs count - projects - updated         0.000000   0.000000   0.000000 ( 21.830556)
                                                         user     system      total        real
normal_user - mrs count - mrs - original             0.000000   0.000000   0.000000 ( 51.376041)
normal_user - mrs count - mrs - updated              0.000000   0.000000   0.000000 ( 26.924873)
                                                         user     system      total        real
normal_user - mrs count - partial - original         0.000000   0.000000   0.000000 ( 52.023007)
normal_user - mrs count - partial - updated          0.000000   0.000000   0.000000 ( 23.062595)
                                                         user     system      total        real
admin - mrs count - nan - original                   0.000000   0.000000   0.000000 ( 32.943281)
admin - mrs count - nan - updated                    0.000000   0.000000   0.000000 ( 18.422469)
                                                         user     system      total        real
admin - mrs count - all - original                   0.000000   0.000000   0.000000 ( 38.943457)
admin - mrs count - all - updated                    0.000000   0.000000   0.000000 ( 25.397915)
                                                         user     system      total        real
admin - mrs count - projects - original              0.000000   0.000000   0.000000 ( 31.901597)
admin - mrs count - projects - updated               0.000000   0.000000   0.000000 ( 17.496475)
                                                         user     system      total        real
admin - mrs count - mrs - original                   0.000000   0.000000   0.000000 ( 37.799263)
admin - mrs count - mrs - updated                    0.000000   0.000000   0.000000 ( 24.788600)
                                                         user     system      total        real
admin - mrs count - partial - original               0.000000   0.000000   0.000000 ( 32.905660)
admin - mrs count - partial - updated                0.000000   0.000000   0.000000 ( 18.467355)

Which look find but for these two cases:

anonymouse - projects count - all - original         0.010000   0.000000   0.010000 ( 14.901842)
anonymouse - projects count - all - updated          0.000000   0.000000   0.000000 ( 16.013438)

anonymouse - projects count - projects - original    0.000000   0.000000   0.000000 (  9.631885)
anonymouse - projects count - projects - updated     0.000000   0.000000   0.000000 ( 10.695942)

Are there points in the code the reviewer needs to double check?

Does this MR meet the acceptance criteria?

What are the relevant issue numbers?

ref #22145 (closed), as I've checked -thanks to @Fleurer's update- the problem in this issue is that foreach search request / page navigation, the count queries for: issues, mrs, projects, milstone get executed.

This mr will not fix it.

Merge request reports