GQL:myList.contains(myField)是否比30个单独的myField == myList(i)查询快?

时间:2011-03-31 13:22:10

标签: google-app-engine google-cloud-datastore gql

我有一个包含100个Longs的列表,以及一个包含Long字段的Entity类型。我想找到其字段值在列表中的所有实体。

我在想,“太棒了!我只会写where :p1.contains(field),”但是AppEngine只会在不到31个元素(新的Baskin Robbins的口号?)中将其分开。所以,现在我想我必须将100的列表分成30个多个列表。

但是在这一点上,我希望有一个单线镜头,我意识到我可以做类似

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

基本上自己分裂成所有子查询。我的问题是......这相当于让appengine将我的30个列表分成30个单独的查询吗?或者是否有一些后端魔法可以同时获取所有30个子查询?

3 个答案:

答案 0 :(得分:4)

子查询在功能上与常规查询相同。目前,子查询是串行运行的,所以自己动手并不比让SDK为你做的慢。但是,在将来,子查询可能会并行执行,这使得它们比自己执行更有效。也可以将“IN”等功能推送到后端,完全避免应用服务器中的问题。

但是,您应该知道,任何需要您执行100个查询的内容都会非常非常慢。如果可以的话,你应该找到一种方法来解决这个问题,而无需进行大量的查询和合并结果。

答案 1 :(得分:1)

该函数可能使用IN(arg1,arg2,...)运算符。

The problem being

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

列表中的每个项目都计为一个子查询,因此您只能使用该查询样式一次获取30个项目。

答案 2 :(得分:0)

使用SELECT * FROM YourKind WHERE value IN list_property将导致运行多个子查询。这些子查询限制为30个。

使用SELECT * FROM YourKind WHERE list_property = value将使用为list_property构建的索引,因此应该使用与list-property可以包含†的条目一样多的条目。

†我认为这仅限于5000 max items for an index