2011-08-02 55 views
2

合併我期待了一堆模型的id:拋出:IllegalArgumentException:拆分提供的查詢需要太多的子查詢內存

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一個固定的限制嗎?

回答

4

這是一個固定的限制。但是,如果你通過ID查找實體,你不應該首先進行查詢 - 你應該通過密鑰進行提取。如果你用外鍵查詢,如果你想超過40的限制,你需要自己做單獨的查詢 - 但是你應該重新考慮你的設計,因爲這是非常低效的。

1

我無法使用GAE的文檔來驗證這一點,所以我的答案可能不完整。然而我發現「ORDER BY createdDateTime desc」設置了這個限制,順便說一句,這是30。我的假設是,如果gae不需要對它進行排序,它不需要在內存中處理查詢。

如果您確實需要「排序呢」,這樣做(這是走在GAE定時,東西反正樣子):「周」或「月」或東西的

添加一個字段包含一個整數的查詢,該整數獨特地分隔週/月(因此您需要其他值爲0..52或0..11的其他值,因爲這些年來它們也需要是唯一的)。比你提出你的查詢,並說明你只對本週的那些感興趣,也許還有上週(或月)。所以,如果我們在4353周,你的查詢就像「:周IN [4353,4352]」。比你應該有一個相對較小的查詢集。然後過濾掉過時的帖子,並將其排序在內存中。