Derby
  1. Derby
  2. DERBY-5695

Speed up population of tables in OrderByAndSortAvoidance

    Details

    • Type: Improvement Improvement
    • Status: Closed
    • Priority: Minor Minor
    • Resolution: Fixed
    • Affects Version/s: 10.9.1.0
    • Fix Version/s: 10.9.1.0
    • Component/s: Test
    • Labels:
      None

      Description

      OrderByAndSortAvoidance executes about 3000 INSERT and UPDATE statements to populate table1 and table2 in its decorateSQL() method. Since each of the statements has to be parsed and compiled, this could take quite some time on less powerful hardware.

      There are essentially three kinds of statements, and they could be parametrized like this:

      INSERT INTO table1 VALUES

      INSERT INTO table2 VALUES (?,?,?)

      UPDATE table2 SET value='true' WHERE id=? AND name='has_address'

      We should parametrize the statements, prepare them once and execute them multiple times in order to speed up the test.

      1. d5695-1a.diff
        648 kB
        Knut Anders Hatlen

        Issue Links

          Activity

          Hide
          Knut Anders Hatlen added a comment -

          Attaching a patch that makes OrderByAndSortAvoidance populate the two large tables (table1 and table2) using prepared statements that are reused.

          The test runs about three times faster in my environment with this patch applied. On my workstation the time is reduced from 24 seconds to 8 seconds. On a somewhat less powerful machine where I sometimes run tests, the time is reduced from 5 minutes to 1.5 minutes.

          As an extra bonus, the test is now almost 7000 lines shorter.

          For good measure, I also removed the following unnecessary calls in decorateSQL():

          getConnection().setAutoCommit(false);
          ...
          getConnection().commit();
          st.close();

          That these calls are unnecessary can be seen from the javadoc for the super-method, CleanDatabaseTestSetup.decorateSQL():

          • Once this method returns the statement will be closed,
          • commit called and the connection closed. The connection
          • returned by s.getConnection() is the default connection
          • and is in auto-commit false mode.
          Show
          Knut Anders Hatlen added a comment - Attaching a patch that makes OrderByAndSortAvoidance populate the two large tables (table1 and table2) using prepared statements that are reused. The test runs about three times faster in my environment with this patch applied. On my workstation the time is reduced from 24 seconds to 8 seconds. On a somewhat less powerful machine where I sometimes run tests, the time is reduced from 5 minutes to 1.5 minutes. As an extra bonus, the test is now almost 7000 lines shorter. For good measure, I also removed the following unnecessary calls in decorateSQL(): getConnection().setAutoCommit(false); ... getConnection().commit(); st.close(); That these calls are unnecessary can be seen from the javadoc for the super-method, CleanDatabaseTestSetup.decorateSQL(): Once this method returns the statement will be closed, commit called and the connection closed. The connection returned by s.getConnection() is the default connection and is in auto-commit false mode.
          Hide
          Knut Anders Hatlen added a comment -

          Committed revision 1328328.

          Show
          Knut Anders Hatlen added a comment - Committed revision 1328328.

            People

            • Assignee:
              Knut Anders Hatlen
              Reporter:
              Knut Anders Hatlen
            • Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved:

                Development