Uploaded image for project: 'Core Server'
  1. Core Server
  2. SERVER-14525

Perf regression in 2.6.2 caused by not caching plans that tie during plan ranking

    XMLWordPrintable

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Critical - P2
    • Resolution: Duplicate
    • Affects Version/s: 2.6.3
    • Fix Version/s: None
    • Component/s: Querying
    • Labels:
    • Operating System:
      ALL
    • Steps To Reproduce:
      Hide

      var tests=[]
      load ('./mongo-perf/util/utils.js')
       
      tests.push( { name: "Queries.TwoInts",
        pre: function( collection ) {
               collection.drop();
               for ( var i = 0; i < 1000; i++ ) {
                 collection.insert( { x: i, y: 2*i } );
               }
               collection.ensureIndex({x: 1});
               collection.ensureIndex({y: 1});
             },
        ops : [
          { op: "find",
            query: { x: { "#SEQ_INT": { seq_id: 0, start: 0, step: 1, mod: 1000 } },
                     y: { "#SEQ_INT": { seq_id: 1, start: 0, step: 2, mod: 2000 } } }
          }
              ]
      } );
       
      runTests([1, 2, 4, 8, 16, 32], 1,'bisect', 'localhost', '27017');

      Show
      var tests=[] load ('./mongo-perf/util/utils.js')   tests.push( { name: "Queries.TwoInts", pre: function( collection ) { collection.drop(); for ( var i = 0; i < 1000; i++ ) { collection.insert( { x: i, y: 2*i } ); } collection.ensureIndex({x: 1}); collection.ensureIndex({y: 1}); }, ops : [ { op: "find", query: { x: { "#SEQ_INT": { seq_id: 0, start: 0, step: 1, mod: 1000 } }, y: { "#SEQ_INT": { seq_id: 1, start: 0, step: 2, mod: 2000 } } } } ] } );   runTests([1, 2, 4, 8, 16, 32], 1,'bisect', 'localhost', '27017');

      Description

      For scenarios in which plans repeatedly tie, SERVER-13675 introduces a performance regression. Ties can actually be quite common for some indexing schemes. For example, you might have indices {a: 1, b: 1} and {a: 1, c: 1} to support two different query patterns. When you query with a predicate over 'a' and without predicates over either 'b' or 'c', however, the two indices will always tie. Not caching one of the two tied plans means that we do extra work by going through the MultiPlanRunner path for every query of this shape.

      Original Description

      Problem:
      Using mongo-perf, the Queries.TwoInts regresses in throughput from 2.6.1 to 2.6.2
      Good 2.6.1

      @@@START@@@
      Queries.TwoInts
              1       15183.6
              2       31095.600000000002
              4       49195.200000000004
              8       84476.8
              16      105745.2
              32      110057.8
      @@@END@@@
      {
              "[object Object]" : {
                      "1" : {
                              "ops_per_sec" : 15183.6
                      },
                      "2" : {
                              "ops_per_sec" : 31095.600000000002
                      },
                      "4" : {
                              "ops_per_sec" : 49195.200000000004
                      },
                      "8" : {
                              "ops_per_sec" : 84476.8
                      },
                      "16" : {
                              "ops_per_sec" : 105745.2
                      },
                      "32" : {
                              "ops_per_sec" : 110057.8
                      }
              }
      }

      Bad Githash: 213700b3af4d53ce7e808dce2c638d98fc4f91db

      @@@START@@@
      Queries.TwoInts
              1       9583.400000000001
              2       19006.199999999997
              4       33435
              8       53750.399999999994
              16      65717.4
              32      67228.8
      @@@END@@@
      {
              "[object Object]" : {
                      "1" : {
                              "ops_per_sec" : 9583.400000000001
                      },
                      "2" : {
                              "ops_per_sec" : 19006.199999999997
                      },
                      "4" : {
                              "ops_per_sec" : 33435
                      },
                      "8" : {
                              "ops_per_sec" : 53750.399999999994
                      },
                      "16" : {
                              "ops_per_sec" : 65717.4
                      },
                      "32" : {
                              "ops_per_sec" : 67228.8
                      }
              }
      }

        Attachments

          Issue Links

            Activity

              People

              • Votes:
                12 Vote for this issue
                Watchers:
                24 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved: