Сколько времени займет выполнение запроса с двумя «содержащимися» тестами в хранилище данных appengine? - PullRequest
0 голосов
/ 06 октября 2010

У меня есть два набора из тридцати или сорока идентификаторов, набор A и набор B. У меня есть вид объекта, который имеет поле idA (идентификатор, который может быть в наборе A) и поле idB (идентификатор, который может бытьв наборе B).Я хочу найти все объекты с idA в наборе A и idB в наборе B.

Я мог бы выполнить запрос с фильтрами типа "A.contains (idA) && B.contains (idB)", ноЯ беспокоюсь о том, сколько времени это займет.С 30 идентификаторами в A наивная реализация может выполнить 30 сравнений на несоответствующий объект в хранилище данных.Или, может быть, хранилище данных сортирует A и B, прежде чем оно будет проверено, и будет делать только 4 или 5 сравнений на сущность в хранилище данных.Или, может быть, что-то, что Google понял, чего у меня нет, могло бы быстро пропустить сущности.

По сути, я пытаюсь выяснить, как выглядит индекс для такого запроса, и если этоэто ужасный запрос для запуска.Может быть, он упорядочивает по idA, затем по idB и сортирует A и B перед тем, как запрос действительно будет выполнен?

Основной вопрос: с 30-40 элементами в A и B будет запрос с фильтрами "A.contains(idA) && B.contains (idB) "выполнить в течение разумного периода времени или я должен попытаться получить эту информацию другим способом?

Ответы [ 2 ]

2 голосов
/ 06 октября 2010

Вы ограничены списком максимум из тридцати предметов. Так что в настоящее время это не будет работать в App Egnine, см. Раздел Фильтры запросов .

Оператор contains () также выполняет несколько запросов, по одному для каждого элемента в предоставленном значении списка, где все остальные фильтры одинаковы, а фильтр contains () заменен фильтром, равным равному. Результаты объединяются в порядке пунктов в списке. Если в запросе содержится более 1 фильтра selected (), запрос выполняется в виде нескольких запросов, по одному для каждой комбинации значений в фильтрах contains ().

Одиночный запрос, содержащий операторы! = Или contains (), ограничен 30 подзапросами.

1 голос
/ 06 октября 2010

App Engine расширит ваш запрос на 30 * 40 = 1200 запросов для отдельных комбинаций idA и idB - или, по крайней мере, будет, если бы он не был ограничен 30 подзапросами.Очевидно, это не будет очень эффективным.

Альтернативы зависят от структуры вашего хранилища данных.Если вы сообщите нам, чего вы пытаетесь достичь, мы можем предложить альтернативы, которые не требуют большого количества запросов.

...