2016-11-16 2 views
0

У меня есть документы следующего вида, что мне нужно для запроса: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

ответ

1

Couchbase 4.5 введена индексация массивов. Это позволяет индексировать отдельные элементы массива, в вашем случае массивы команд. Это будет важно для выполнения вашего запроса. С 4.5.1 или 4.6 вы сделаете следующее:

CREATE INDEX idx_owner ON default(ownerID); 
CREATE INDEX idx_teams ON default(DISTINCT ARRAY t FOR t IN teams END); 

SELECT id 
FROM default AS p 
WHERE p.ownerID = $1 
UNION 
SELECT id 
FROM default AS p 
WHERE ANY t IN p.teams SATISFIES t = $2 END; 
+0

Да, я использую сообщество прямо сейчас, так что я верю, что на данный момент я придерживаюсь 4.1, но я обязательно обновлю, когда это возможно. – cozzbp

+0

Также после некоторых тестов по использованию WHERE ANY vs ARRAY_CONTAINS (по крайней мере, в 4.1), ARRAY_CONTAINS, похоже, немного выигрывает на скорости. – cozzbp

+0

Полученный мной признак: вы * должны * использовать одно и то же имя переменной (t в этом примере) как для CREATE INDEX, так и для SELECT. Если они не совпадают, запрос может работать, но намного медленнее, потому что планировщик запросов не будет использовать индекс (даже с учетом ИНДЕКСА ПОЛЬЗОВАТЕЛЯ). – slinkp

Смежные вопросы