Uploaded image for project: 'Moodle'
  1. Moodle
  2. MDL-80480

Performance Enhancement in bump_submission_for_stale_conversions Task (slow query)

XMLWordPrintable

    • Icon: Improvement Improvement
    • Resolution: Duplicate
    • Icon: Minor Minor
    • None
    • 4.0.12, 4.1.9, 4.2.6, 4.3.3, 4.4
    • Assignment
    • MOODLE_400_STABLE, MOODLE_401_STABLE, MOODLE_402_STABLE, MOODLE_403_STABLE, MOODLE_404_STABLE

      I think I have successfully resolved a persistent slow query issue in the bump_submission_for_stale_conversions task within Moodle, significantly improving execution time from over a day to less than 20 seconds on our (huge) database.

      Changes made :

      ... AND f3.contextid = f1.contextid AND ...

      WHERE f1.component = 'assignsubmission_file' AND ...
      

      These modifications were applied to the bump_submission_for_stale_conversions.php file, ensuring the optimal utilization of database indexes and resulting in a substantial reduction in query execution time.

      My local commit :

      commit b83ae7c074744a6f4bf802ff6fdb3bdb98403064 (HEAD -> core_modification_401, origin/core_modification_401)
      Author: Piton Olivier <olivier@cblue.be>
      Date:   Thu Dec 21 09:45:00 2023 +0100    CB-632377 - core modifications - improve bump_submission_for_stale_conversions ad hoc taskdiff --git a/mod/assign/feedback/editpdf/classes/task/bump_submission_for_stale_conversions.php b/mod/assign/feedback/editpdf/classes/task/bump_submission_for_stale_conversions.php
      index 05f4815f372..eda71522c51 100644
      --- a/mod/assign/feedback/editpdf/classes/task/bump_submission_for_stale_conversions.php
      +++ b/mod/assign/feedback/editpdf/classes/task/bump_submission_for_stale_conversions.php
      @@ -39,6 +39,8 @@ class bump_submission_for_stale_conversions extends adhoc_task {
       
           /**
            * Run the task.
      +     *
      +     * @throws \dml_exception // CBLUE - #632377 -- Add to hide editor's warnings
            */
           public function execute() {
               global $DB;
      @@ -67,22 +69,23 @@ class bump_submission_for_stale_conversions extends adhoc_task {
                   // Also check if the file has a greater modified time than the submission, if it does
                   // that means it is both stale (as per the above) and will never be reconverted.
                   $sql = "SELECT f3.id, f3.timemodified as fmodified, asu.id as submissionid
      -                      FROM {files} f1
      -                 LEFT JOIN {files} f2 ON f1.contenthash = f2.filename
      -                           AND f2.component = 'core' AND f2.filearea = 'documentconversion'
      -                      JOIN {assign_submission} asu ON asu.id = f1.itemid
      -                      JOIN {assign_grades} asg ON asg.userid = asu.userid AND asg.assignment = asu.assignment
      -                      JOIN {files} f3 ON f3.itemid = asg.id
      -                     WHERE f1.filearea = 'submission_files'
      -                           AND f3.timecreated >= :earliest
      -                           AND ($extensionsql)
      -                           AND f2.filename IS NULL
      -                           AND f3.component = 'assignfeedback_editpdf'
      -                           AND f3.filearea = 'combined'
      -                           AND f3.filename = 'combined.pdf'
      -                           AND f3.timemodified >= asu.timemodified";
      +                FROM {files} f1
      +                JOIN {assign_submission} asu ON asu.id = f1.itemid
      +                JOIN {assign_grades} asg ON asg.userid = asu.userid AND asg.assignment = asu.assignment
      +                JOIN {files} f3 ON f3.component = 'assignfeedback_editpdf'
      +                    AND f3.filearea = 'combined'
      +                    AND f3.filename = 'combined.pdf'
      +                    AND f3.contextid = f1.contextid  -- CBLUE - #632377 -- add this condition to use index
      +                    AND f3.itemid = asg.id
      +                    AND f3.timemodified >= asu.timemodified
      +                LEFT JOIN {files} f2 ON f1.contenthash = f2.filename AND f2.component = 'core' AND f2.filearea = 'documentconversion'
      +                WHERE f1.component = 'assignsubmission_file' -- CBLUE - #632377 -- add this condition to use index
      +                    AND f1.filearea = 'submission_files'
      +                    AND f3.timecreated >= :earliest
      +                    AND ($extensionsql)
      +                    AND f2.filename IS NULL";
       
      -            $submissionstobump = $DB->get_records_sql($sql, ['earliest' => $earliestconversion->min] + $extensionparams);
      +            $submissionstobump = $DB->get_recordset_sql($sql, ['earliest' => $earliestconversion->min] + $extensionparams); // CBLUE - #632377 -- improve performance
                   foreach ($submissionstobump as $submission) {
       
                       // Set the submission modified time to one second later than the
      @@ -98,6 +101,7 @@ class bump_submission_for_stale_conversions extends adhoc_task {
                       mtrace('Set submission ' . $submission->submissionid . ' timemodified to ' . $newmodified);
                       $DB->update_record('assign_submission', $record);
                   }
      +            $submissionstobump->close(); // CBLUE - #632377 -- improve performance
               }
           }
       } 

      Kind regards,

      Olivier

            Unassigned Unassigned
            Trolli Olivier Piton
            Votes:
            4 Vote for this issue
            Watchers:
            8 Start watching this issue

              Created:
              Updated:
              Resolved:

                Error rendering 'clockify-timesheets-time-tracking-reports:timer-sidebar'. Please contact your Jira administrators.