Skip to content

Commit

Permalink
perf: Reduce database calls when generating problem responses report (#…
Browse files Browse the repository at this point in the history
…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.
  • Loading branch information
ahmed-zubair-1998 authored Jan 16, 2024
1 parent 3078042 commit 73a446d
Show file tree
Hide file tree
Showing 2 changed files with 2 additions and 2 deletions.
2 changes: 1 addition & 1 deletion lms/djangoapps/courseware/user_state_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -600,7 +600,7 @@ def iter_all_for_block(self, block_key, scope=Scope.user_state):
if scope != Scope.user_state:
raise ValueError("Only Scope.user_state is supported")

results = StudentModule.objects.order_by('id').filter(module_state_key=block_key)
results = StudentModule.objects.order_by('id').filter(module_state_key=block_key).select_related('student')
p = Paginator(results, settings.USER_STATE_BATCH_SIZE)

for page_number in p.page_range:
Expand Down
2 changes: 1 addition & 1 deletion lms/djangoapps/instructor_analytics/basic.py
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down

0 comments on commit 73a446d

Please sign in to comment.