GQL: myList.contains (myField) работает быстрее, чем 30 отдельных запросов myField == myList (i)? - PullRequest
0 голосов
/ 31 марта 2011

У меня есть список из 100 Long и вид Entity с полем Long.Я хочу найти все объекты, чье значение поля находится в списке.

Я думал: «Отлично! Я просто напишу where :p1.contains(field)», но AppEngine разделит это только на менее чем 31 элемент.(новый лозунг Баскина Роббинса?).Итак, теперь я думаю, что мне придется разделить список 100 на несколько списков по 30.

Но в этот момент, мои надежды на выстрел в одну строку, я понял, что могу сделать что-то вроде

for (Long number : list)
    GQL("select * from Kind where field = " + number)

по сути делится на все подзапросы сам.Мой вопрос ... это эквивалентно разрешению appengine разделить мой список из 30 на 30 отдельных запросов?Или есть какая-то внутренняя магия, которую они делают, чтобы получить все 30 подзапросов одновременно?

Ответы [ 3 ]

4 голосов
/ 01 апреля 2011

Подзапросы функционально идентичны обычным запросам.В настоящее время подзапросы выполняются последовательно, поэтому выполнение этого самостоятельно не будет медленнее, чем позволить SDK сделать это за вас.Однако в будущем, вероятно, подзапросы будут выполняться параллельно, что сделает их намного более эффективными, чем выполнение этого самостоятельно.Также возможно, что такая функциональность, как «IN», может быть перенесена в бэкэнд, что позволит полностью избежать проблемы на сервере приложений.

Однако вы должны знать, что все, что требует выполнения 100 запросов, будеточень, очень медленноЕсли вы можете, вы должны найти способ обойти это, не делая кучу запросов и не объединяя результаты.

1 голос
/ 31 марта 2011

Эта функция, вероятно, использует оператор IN (arg1, arg2, ...).

Проблема в том, что :

A single query containing != or IN operators is limited to 30 sub-queries.

Каждый элемент в списке считается подзапросом, поэтому вы можете выбрать только 30 элементов одновременно с этим стилем запроса.

0 голосов
/ 31 марта 2011

Использование SELECT * FROM YourKind WHERE value IN list_property приведет к запуску нескольких подзапросов. Эти подзапросы ограничены 30 *. 1002 *

Использование SELECT * FROM YourKind WHERE list_property = value будет использовать индекс, созданный для вашего list_property, поэтому он должен работать с таким количеством записей, которое может содержать ваше свойство list †.

† Я думаю, что это будет ограничено 5000 макс. Пунктов для индекса

...