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

Covered query делает FETCH

    • Type: Icon: Bug Bug
    • Resolution: Duplicate
    • Priority: Icon: Major - P3 Major - P3
    • None
    • Affects Version/s: 4.0.9, 4.0.10
    • Component/s: Index Maintenance
    • Environment:
      ubuntu 16.04
    • ALL
    • Hide
      1. Загрузить приложенный дамп с коллекцией signedTest, там 1000 записей.
      2. Создать индекс:
        db.signedTest.createIndex({'data.contracts.dateSigned': 1})
      3. Сделать запрос с $lt и убедится, что работает COUNT_SCAN:
        db.signedTest.explain('executionStats').count({"data.contracts.dateSigned":{$lt:"2011-06-05"}})
      4. Запустить запрос с $lt, $gt и увидеть, что используется индекс для фильтрации с одной стороны и FETCH для фильтрации с другой: db.signedTest.explain('executionStats').count({"data.contracts.dateSigned":{$gt:"2009-05-01",$lt:"2011-06-05"}})
      Show
      Загрузить приложенный дамп с коллекцией signedTest, там 1000 записей. Создать индекс: db.signedTest.createIndex({'data.contracts.dateSigned': 1}) Сделать запрос с $lt и убедится, что работает  COUNT_SCAN: db.signedTest.explain('executionStats').count({"data.contracts.dateSigned":{$lt:"2011-06-05"}}) Запустить запрос с $lt, $gt и увидеть, что используется индекс для фильтрации с одной стороны и FETCH для фильтрации с другой: db.signedTest.explain('executionStats').count({"data.contracts.dateSigned":{$gt:"2009-05-01",$lt:"2011-06-05"}})

      В документах коллекции есть поле contracts, которое хранит массив объектов, в объекте есть строковое поле signedDate с значениями такого вида "2016-09-23T18:02:00+02:02". Это поле проиндексировано. Запросы с count и $lt (аналогично $gt) используют индекс, stage COUNT_SCAN. Но запрос с одновременнно $gt и $lt использует индекс только с одной стороны, а другую фильтрует на FETCH стадии, из-за чего очень страдает скорость запроса (неприемлимо долго).

      Почему индекс не использует одновременно две границы?

      Была версия, что проблема в строке, её значение перенес в новое поле того же массива, в формате ISODate, создал индекс - но работает все точно так же. Отдельно отмечу, что не во всех документах есть массив contracts, хотя в большой части.

        1. signedTest.json
          7.76 MB
          Bocharov Vladislav

            Assignee:
            Unassigned Unassigned
            Reporter:
            devbocharov Bocharov Vladislav
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

              Created:
              Updated:
              Resolved: