Improve approvals user count query
As pointed on https://gitlab.com/gitlab-org/gitlab-ce/issues/32536, the new MR widget live update brought up a slow query being made on https://gitlab.com/gitlab-org/gitlab-ee/blob/master/app/models/concerns/approvable.rb#L37-60. As a quick solution, this field stopped being exposed on MergeRequestEntity
(https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/1933) - where it was polled every 10s
unnecessarily. But, ultimately, this query should be improved.
SELECT COUNT(*)
FROM users
WHERE (users.state IN (?))
AND (users.ghost = ? OR users.ghost IS NULL)
AND (users.support_bot = ? OR users.support_bot IS NULL)
AND (
(
id IN (
SELECT members.user_id
FROM members
WHERE members.source_type = ?
AND members.type IN (?)
AND members.source_id = ?
AND members.source_type = ?
AND members.type IN (?)
AND members.requested_at IS NULL
AND (access_level > ?)
ORDER BY members.id DESC
)
OR id IN (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
OR id IN (
SELECT members.user_id
FROM members
WHERE members.source_type = ?
AND members.type IN (?)
AND members.source_id = ?
AND members.source_type = ?
AND members.type IN (?)
AND members.requested_at IS NULL
AND (access_level > ?)
ORDER BY members.id DESC
)
)
AND id NOT IN (
SELECT approvals.user_id
FROM approvals
WHERE approvals.merge_request_id = ?
)
)
AND (users.id != ?)
Edited by Oswaldo Ferreir