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

{$exists:false} performance regression

    • Type: Icon: Bug Bug
    • Resolution: Duplicate
    • Priority: Icon: Major - P3 Major - P3
    • None
    • Affects Version/s: 2.6.0-rc0
    • Component/s: Querying
    • Labels:
    • ALL
    • Hide

      See QA-401

      Show
      See QA-401

      The following query takes ~70us in v2.4.9, and ~722us in v2.6.0rc0:

      db.regressions.find({$query:{_id: {$exists: false }}, $orderby:{_id:1}});
      

      v2.4.9 explain output:

      > db.regressions.find({$query:{_id: {$exists: false }}, $orderby:{_id:1}, $explain:1}).pretty();
      {
              "cursor" : "BtreeCursor _id_",
              "isMultiKey" : false,
              "n" : 0,
              "nscannedObjects" : 0,
              "nscanned" : 0,
              "nscannedObjectsAllPlans" : 0,
              "nscannedAllPlans" : 0,
              "scanAndOrder" : false,
              "indexOnly" : false,
              "nYields" : 0,
              "nChunkSkips" : 0,
              "millis" : 0,
              "indexBounds" : {
                      "_id" : [
                              [
                                      null,
                                      null
                              ]
                      ]
              },
              "allPlans" : [
                      {
                              "cursor" : "BtreeCursor _id_",
                              "n" : 0,
                              "nscannedObjects" : 0,
                              "nscanned" : 0,
                              "indexBounds" : {
                                      "_id" : [
                                              [
                                                      null,
                                                      null
                                              ]
                                      ]
                              }
                      }
              ],
              "oldPlan" : {
                      "cursor" : "BtreeCursor _id_",
                      "indexBounds" : {
                              "_id" : [
                                      [
                                              null,
                                              null
                                      ]
                              ]
                      }
              },
              "server" : "zzyzx:27017"
      }
      

      v2.6.0rc0 explain output:

      > db.regressions.find({$query:{_id: {$exists: false }}, $orderby:{_id:1}, $explain:1}).pretty();
      {
              "cursor" : "BtreeCursor _id_",
              "isMultiKey" : false,
              "n" : 0,
              "nscannedObjects" : 1442,
              "nscanned" : 1442,
              "nscannedObjectsAllPlans" : 1540,
              "nscannedAllPlans" : 1540,
              "scanAndOrder" : false,
              "indexOnly" : false,
              "nYields" : 11,
              "nChunkSkips" : 0,
              "millis" : 4,
              "indexBounds" : {
                      "_id" : [
                              [
                                      {
                                              "$minElement" : 1
                                      },
                                      {
                                              "$maxElement" : 1
                                      }
                              ]
                      ]
              },
              "allPlans" : [
                      {
                              "cursor" : "BtreeCursor _id_",
                              "isMultiKey" : false,
                              "n" : 0,
                              "nscannedObjects" : 1442,
                              "nscanned" : 1442,
                              "scanAndOrder" : false,
                              "indexOnly" : false,
                              "nChunkSkips" : 0,
                              "indexBounds" : {
                                      "_id" : [
                                              [
                                                      {
                                                              "$minElement" : 1
                                                      },
                                                      {
                                                              "$maxElement" : 1
                                                      }
                                              ]
                                      ]
                              }
                      },
                      {
                              "cursor" : "BasicCursor",
                              "isMultiKey" : false,
                              "n" : 0,
                              "nscannedObjects" : 98,
                              "nscanned" : 98,
                              "scanAndOrder" : true,
                              "indexOnly" : false,
                              "nChunkSkips" : 0
                      }
              ],
              "server" : "zzyzx:27017",
              "filterSet" : false,
              "stats" : {
                      "type" : "FETCH",
                      "works" : 1443,
                      "yields" : 11,
                      "unyields" : 11,
                      "invalidates" : 0,
                      "advanced" : 0,
                      "needTime" : 1442,
                      "needFetch" : 0,
                      "isEOF" : 1,
                      "alreadyHasObj" : 0,
                      "forcedFetches" : 0,
                      "matchTested" : 0,
                      "children" : [
                              {
                                      "type" : "IXSCAN",
                                      "works" : 1442,
                                      "yields" : 11,
                                      "unyields" : 11,
                                      "invalidates" : 0,
                                      "advanced" : 1442,
                                      "needTime" : 0,
                                      "needFetch" : 0,
                                      "isEOF" : 1,
                                      "keyPattern" : "{ _id: 1 }",
                                      "boundsVerbose" : "field #0['_id']: [MinKey, MaxKey]",
                                      "isMultiKey" : 0,
                                      "yieldMovedCursor" : 0,
                                      "dupsTested" : 0,
                                      "dupsDropped" : 0,
                                      "seenInvalidated" : 0,
                                      "matchTested" : 0,
                                      "keysExamined" : 1442,
                                      "children" : [ ]
                              }
                      ]
              }
      }
      

      QA-401 results:

      > db.regressions.find({$query:{"query":{$not:/where/}}, $orderby:{deltaRatio:-1}}).limit(1).pretty();
      {
              "_id" : ObjectId("530d751fd8ed4fb55a7bda24"),
              "deltaRatio" : "9.99",
              "deltaUs" : 650.17,
              "v249Avg" : "72.33",
              "v249Results" : [
                      72,
                      73,
                      74,
                      71,
                      72,
                      72
              ],
              "rc0Avg" : "722.50",
              "rc0Results" : [
                      715,
                      767,
                      704,
                      709,
                      708,
                      732
              ],
              "testId" : "GeneratedTests::GeneratedQuery659[Compound2]",
              "query" : "{ query: { _id: { $exists: false } }, orderby: { _id: 1 } }",
              "proj" : "{ NONE: 1 }",
              "index" : "Compound2",
              "rc0Count" : 0,
              "v249Count" : 0,
              "countsMatch" : true
      }
      

      Of course, it's worth noting that this specific query is unlikely to ever be used, given that it sorts by a field which does not exist.

            Assignee:
            samantha.ritter@mongodb.com Samantha Ritter (Inactive)
            Reporter:
            benjamin.becker Ben Becker
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated:
              Resolved: