perf: Reduce database calls when generating problem responses report (#33940)

During the process of generatinng report for problem responses,
there are two places where N + 1 query problem exist. In both
cases, `StudentModule` objects are fetched and looped over where
`student.username` field for each object is accessed. This result
in a seperate database call to get the username for each student
response.

This problem is fixed by creating a join to fetch the related
table in the original query using `select_related`. In a test
conducted on report having 5000 `StudentModule` objects, the
number of queries for the request reduced from 8363 to 29. The
total time taken for the task reduced from 23764 ms to 7394 ms.
This commit is contained in:
ahmed-zubair-1998
2024-01-16 23:41:15 +05:00
committed by GitHub
parent 3078042e89
commit 73a446d85b
2 changed files with 2 additions and 2 deletions

View File

@@ -349,7 +349,7 @@ def list_problem_responses(course_key, problem_location, limit_responses=None):
smdat = StudentModule.objects.filter(
course_id=course_key,
module_state_key=problem_key
)
).select_related('student')
smdat = smdat.order_by('student')
if limit_responses is not None:
smdat = smdat[:limit_responses]