Будет ли снижение производительности при использовании индекса с Object_Pairs (в случае покрытого запроса) - Couchbase - PullRequest
1 голос
/ 19 февраля 2020

Предположим, я создаю индекс для Object_pair (значения) .val.data .

Будет ли мой индекс хранить поле «значения» в виде массива (с именами элементов для ID и val для данных из-за object_pair)?

Если это так, а также, если мой n1ql запрос является покрытым запросом (выборка только Object_pair (values) .val.data с помощью предложения select), будут ли по-прежнему накладные расходы на производительность? (Поскольку у меня сложилось впечатление, что в приведенном выше случае, поскольку индекс уже содержал бы поле « values ​​» в виде массива, фактическое преобразование object_pair не происходило бы, следовательно, избегая накладных расходов. Только в случае непокрытого запроса будет доступен фактический документ и выполнено преобразование object_pair в поле « values ​​».

Couchbase document:

    "values": {
        "item_1": {
            "data": [{
                    "name": "data_1",
                    "value": "A"
                },
                {
                    "name": "data_2",
                    "value": "XYZ"
                }
            ]
        },
        "item_2": {
            "data": [{
                    "name": "data_1",
                    "value": "123"
                },
                {
                    "name": "data_2",
                    "value": "A23"
                }
            ]
        }
    }
}```

UPDATE:
suppose if we plan to create index on Object_pair(values)[*].val.data & Object_pair(values)[*].name

Index: CREATE INDEX idx01 ON ent_comms_tracking(ARRAY { value.name, value.val.data} FOR value IN object_pairs(values) END)

Query: SELECT ARRAY { value.name, value.val.data} FOR value IN object_pairs(values) END as values_array FROM bucket

1 Ответ

2 голосов
/ 21 февраля 2020

Можете ли вы вставить полный оператор создания индекса?

Создание индекса для OBJECT_PAIRS (values). Val.data ничего не индексирует.

Вы можете проверить это, создав первичный индекс и выполнив следующий запрос:

SELECT OBJECT_PAIRS(`values`).val FROM mybucket

Вывод:

[
  {}
]

OBJECT_PAIRS (values) возвращает массивы значений, которые содержат имя атрибута и пары значений значений объекта -

SELECT OBJECT_PAIRS(`values`) FROM mybucket


[
  {
    "$1": [
      {
        "name": "item_1",
        "val": {
          "data": [
            {
              "name": "data_1",
              "value": "A"
            },
            {
              "name": "data_2",
              "value": "XYZ"
            }
          ]
        }
      },
      {
        "name": "item_2",
        "val": {
          "data": [
            {
              "name": "data_1",
              "value": "123"
            },
            {
              "name": "data_2",
              "value": "A23"
            }
          ]
        }
      }
    ]
  }
]

Это массив , так что val этого не имеет прямой ссылки

...