IllegalArgumentException: разделение предоставленного запроса требует, чтобы слишком много подзапросов были объединены в памяти - PullRequest
2 голосов
/ 02 августа 2011

Я смотрю несколько идентификаторов моделей:

List<Long> ids = lookupIds(searchCriteria);

И затем запускаю запрос, чтобы упорядочить их:

fooModelList = (List<FooModel>) query.execute(ids);

Журнал показывает, что это GQL, что этокомпилируется в:

Compiling "SELECT FROM com.foo.FooModel WHERE 
:p.contains(id) ORDER BY createdDateTime desc RANGE 0,10"

Когда ids ArrayList маленький, это прекрасно работает.

Но при определенном размере (может быть, 40) я получаю эту ошибку:

IllegalArgumentException: Splitting the provided query requires 
that too many subqueries are merged in memory.

Есть ли способ обойти это или это фиксированный предел в GAE?

Ответы [ 2 ]

4 голосов
/ 02 августа 2011

Это фиксированный лимит.Если вы ищите объекты по идентификатору, вы не должны делать запросы в первую очередь - вы должны делать выборки по ключу.Если вы запрашиваете внешний ключ, вам нужно будет выполнить отдельные запросы самостоятельно, если вы хотите превысить предел 40 - но вам, вероятно, следует пересмотреть свой дизайн, поскольку это крайне неэффективно.

1 голос
/ 26 ноября 2012

Я не смог проверить это с помощью документации GAE, поэтому мой ответ может быть неполным.Тем не менее, я обнаружил, что «ORDER BY создалDateTime desc» устанавливает этот предел, кстати, 30.Моя гипотеза состоит в том, что если gae не нужно его сортировать, ему не нужно обрабатывать запрос в памяти.

Если вам нужно «отсортировать», сделайте это (это путьс помощью timed-вещи в GAE в любом случае):

Добавить поле 'week' или 'month' или что-то в запрос, который содержит целое число, которое уникально разделяет недели / месяцы (поэтому вам нужно что-то еще, кроме 0 ..)52 или 0..11, так как они также должны быть уникальными на протяжении многих лет).Затем вы делаете запрос и заявляете, что вас интересуют только те, кто есть на этой неделе, а может быть, и на прошлой неделе (или месяце).Так что, если мы находимся на неделе 4353, у вашего запроса будет что-то вроде:: week IN [4353, 4352].Чем у вас должен быть сравнительно небольшой набор запросов.Затем отфильтруйте сообщения, которые слишком старые, и отсортируйте их в памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...