У меня есть документы следующего вида, что мне нужно для запроса:N1QL Запрос ARRAY_CONTAINS скорость
{
"id": "-KWiJ1LlYbXSSRUmocwK",
"ownerID": "72f16d9d-b905-498c-a7ff-9702cdcae996",
"orgID": "20071513",
"teams": [
"5818f7a75f84c800079186a8",
"5818cbb25f84c800079186a7"
]
}
И я хочу, чтобы иметь возможность запрашивать на основе OwnerId и массива команд. Мой запрос в настоящее время выглядит следующим образом:
SELECT id FROM
default AS p
WHERE p.ownerID = $1
OR ARRAY_CONTAINS(p.teams, $2)
ORDER BY id
Так что я могу получить документы с ожидаемым OwnerId, а также документы, которые имеют конкретную команду идентификатор в массиве команд. Этот запрос работает, но меня беспокоит производительность, когда у меня много документов, и, возможно, некоторые документы имеют до 20 назначенных команд.
Есть ли я на правильном пути?
РЕДАКТИРОВАТЬ: Couchbase версии 4.1
Да, я использую сообщество прямо сейчас, так что я верю, что на данный момент я придерживаюсь 4.1, но я обязательно обновлю, когда это возможно. – cozzbp
Также после некоторых тестов по использованию WHERE ANY vs ARRAY_CONTAINS (по крайней мере, в 4.1), ARRAY_CONTAINS, похоже, немного выигрывает на скорости. – cozzbp
Полученный мной признак: вы * должны * использовать одно и то же имя переменной (t в этом примере) как для CREATE INDEX, так и для SELECT. Если они не совпадают, запрос может работать, но намного медленнее, потому что планировщик запросов не будет использовать индекс (даже с учетом ИНДЕКСА ПОЛЬЗОВАТЕЛЯ). – slinkp