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:
committed by
GitHub
parent
3078042e89
commit
73a446d85b
@@ -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]
|
||||
|
||||
Reference in New Issue
Block a user