diff --git a/common/djangoapps/django_comment_common/models.py b/common/djangoapps/django_comment_common/models.py
index 0d27aa9a07efe8c49386dd2128733adf19683f15..cbe7c38e0875df29b2ad664faa6024dfbdeeb0af 100644
--- a/common/djangoapps/django_comment_common/models.py
+++ b/common/djangoapps/django_comment_common/models.py
@@ -145,15 +145,19 @@ def all_permissions_for_user_in_course(user, course_id):  # pylint: disable=inva
     if course is None:
         raise ItemNotFoundError(course_id)
 
-    all_roles = {role.name for role in Role.objects.filter(users=user, course_id=course_id)}
-
-    permissions = {
-        permission.name
-        for permission
-        in Permission.objects.filter(roles__users=user, roles__course_id=course_id)
-        if not permission_blacked_out(course, all_roles, permission.name)
-    }
-    return permissions
+    roles = Role.objects.filter(users=user, course_id=course_id)
+    role_names = {role.name for role in roles}
+
+    permission_names = set()
+    for role in roles:
+        # Intentional n+1 query pattern to get permissions for each role because
+        # Aurora's query optimizer can't handle the join proplerly on 30M+ row
+        # tables (EDUCATOR-3374). Fortunately, there are very few forum roles.
+        for permission in role.permissions.all():
+            if not permission_blacked_out(course, role_names, permission.name):
+                permission_names.add(permission.name)
+
+    return permission_names
 
 
 class ForumsConfig(ConfigurationModel):
diff --git a/lms/djangoapps/courseware/tests/test_discussion_xblock.py b/lms/djangoapps/courseware/tests/test_discussion_xblock.py
index 10b8bbacd5a8244052fead02e6a2090df252d4a3..45cde8ef83c578875ed5d4893c03e55a9ec35f01 100644
--- a/lms/djangoapps/courseware/tests/test_discussion_xblock.py
+++ b/lms/djangoapps/courseware/tests/test_discussion_xblock.py
@@ -406,7 +406,7 @@ class TestXBlockQueryLoad(SharedModuleStoreTestCase):
         # * django_comment_client_role
         # * django_comment_client_permission
         # * lms_xblock_xblockasidesconfig
-        num_queries = 3
+        num_queries = 2
         for discussion in discussions:
             discussion_xblock = get_module_for_descriptor_internal(
                 user=user,