From bfe06f760082daf5fd445528b197a18c35f80fa7 Mon Sep 17 00:00:00 2001 From: Ruslan Kabalin Date: Fri, 2 Sep 2016 11:38:22 +0100 Subject: [PATCH] MDL-55776 enrol: Optimise enrolled users listing. Here we optimise SQL queries for enrolled users list. Expensive subquery is replaced with faster LEFT JOIN and the whole groups filtering component is aded on demand. --- enrol/locallib.php | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/enrol/locallib.php b/enrol/locallib.php index ea3d8e85509..2d918da0e54 100644 --- a/enrol/locallib.php +++ b/enrol/locallib.php @@ -171,13 +171,12 @@ class course_enrolment_manager { $sqltotal = "SELECT COUNT(DISTINCT u.id) FROM {user} u JOIN {user_enrolments} ue ON (ue.userid = u.id AND ue.enrolid $instancessql) - JOIN {enrol} e ON (e.id = ue.enrolid) - LEFT JOIN {groups_members} gm ON u.id = gm.userid AND gm.groupid IN ( - SELECT g.id - FROM {groups} g - WHERE g.courseid = e.courseid - ) - WHERE $filtersql"; + JOIN {enrol} e ON (e.id = ue.enrolid)"; + if ($this->groupfilter) { + $sqltotal .= " LEFT JOIN ({groups_members} gm JOIN {groups} g ON (g.id = gm.groupid)) + ON (u.id = gm.userid AND g.courseid = e.courseid)"; + } + $sqltotal .= "WHERE $filtersql"; $this->totalusers = (int)$DB->count_records_sql($sqltotal, $params); } return $this->totalusers; @@ -245,13 +244,12 @@ class course_enrolment_manager { FROM {user} u JOIN {user_enrolments} ue ON (ue.userid = u.id AND ue.enrolid $instancessql) JOIN {enrol} e ON (e.id = ue.enrolid) - LEFT JOIN {user_lastaccess} ul ON (ul.courseid = e.courseid AND ul.userid = u.id) - LEFT JOIN {groups_members} gm ON u.id = gm.userid AND gm.groupid IN ( - SELECT g.id - FROM {groups} g - WHERE g.courseid = e.courseid - ) - WHERE $filtersql + LEFT JOIN {user_lastaccess} ul ON (ul.courseid = e.courseid AND ul.userid = u.id)"; + if ($this->groupfilter) { + $sql .= " LEFT JOIN ({groups_members} gm JOIN {groups} g ON (g.id = gm.groupid)) + ON (u.id = gm.userid AND g.courseid = e.courseid)"; + } + $sql .= "WHERE $filtersql ORDER BY $sort $direction"; $this->users[$key] = $DB->get_records_sql($sql, $params, $page*$perpage, $perpage); }