IN против OR в ключевом gemfire OQL

При работе с содержимым, распределенным по нескольким таблицам (регионам с точки зрения gemfire) на разных узлах в кластере, какой оператор обеспечивает более быстрые результаты.

Скажем, на данный момент мой поисковый OQL-запрос выглядит следующим образом:

select * from /content_region where content_type = 'xyz' AND (shared_with.contains('john') OR (shared_with.contains('michael') OR (shared_with.contains('peter')))

Учтите, что «shared_with» — это список.

Использованная литература:

IN vs OR в предложении SQL WHERE

Настройка производительности SQL для Oracle Many OR vs IN () [дубликат]


person ms_27    schedule 08.07.2016    source источник


Ответы (1)


«IN» в проиндексированном поле будет намного более отзывчивым, чем «ИЛИ» в качестве прямого ответа, но есть исключения.

Некоторые комментарии к вашему примеру:

select * from /content_region where content_type = 'xyz' AND (shared_with.contains('john') OR (shared_with.contains('michael') OR (shared_with.contains('peter')))

Вы хотите, чтобы это "content_type = 'xyz' AND " было перед вашими операторами «ИЛИ», потому что GemFire ​​сначала выполнит этот оператор и с меньшим набором результатов применит операцию «содержит» в памяти с ограниченным набором результатов.

В приведенном вами примере предложение «IN» не может быть применено к содержимому.

Прежде чем оставить этот ответ, я действительно часто использую IN с ключами из другого набора результатов. Если атрибут проиндексирован, это очень быстро.

person Wes Williams    schedule 13.08.2016
comment
Спасибо @Wes. Да, мы используем индексы на основе карт gemfire, и на данный момент OR работает лучше, чем IN для прямого поиска на равенство. А для функции «содержит» предложение IN даже не поддерживает поиск регулярных выражений, например. '%john%' для извлечения контента, которым поделились 'john frey', 'john geller' и т. д. Итак, мы использовали предложение OR с методом 'contains'. - person ms_27; 23.08.2016
comment
Извини, я виноват. contains() находится здесь в списке, поэтому он также не поддерживает частичный поиск с помощью '%'. - person ms_27; 23.08.2016