具有两个“包含”测试的查询需要多长时间才能在appengine数据存储上执行?

时间:2010-10-05 22:48:07

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

我有两组三十或四十个ID,设置A和设置B.我有一种具有字段idA(可能在集合A中的id)和字段idB(可能是id的id)的实体在集B)。我想找到集合A中idA和集合B中idB的所有实体。

我可以使用“A.contains(idA)&& B.contains(idB)”这样的过滤器执行查询,但我担心这需要多长时间。在A中有30个ID,一个简单的实现可能需要对数据存储区中的每个非匹配实体进行30次比较。或者数据存储区在查看之前对A和B进行排序,并且在数据存储区中每个实体只需要进行4或5次比较。或者,也许谷歌发现我没有,可以快速跳过实体。

基本上,我试图弄清楚这样一个查询的索引是什么样的,如果这是一种可怕的查询运行。也许它由idA命令,然后由idB命令,并在查询实际执行之前对A和B进行排序?

主要问题:在A和B中有30-40个元素,带有过滤器“A.contains(idA)&& B.contains(idB)”的查询将在合理的时间内执行,或者我应该试图以另一种方式获取此信息?

2 个答案:

答案 0 :(得分:2)

您仅限于最多30个项目的列表。因此,目前这不会在App Egnine上运行,请参阅Query Filters部分。

  

contains()运算符还执行多个查询,一个用于提供的列表值中的每个项目,其中所有其他过滤器都相同,并且contains()过滤器替换为等于过滤器。结果按列表中项目的顺序合并。如果查询具有多于1个contains()过滤器,则查询将作为多个查询执行,每个查询对于contains()过滤器中的每个值组合执行一次。

     

包含!=或contains()运算符的单个查询限制为30个子查询。

答案 1 :(得分:1)

App Engine会将您的查询扩展为针对idA和idB的各个组合的30 * 40 = 1200个查询 - 或者至少,如果它不限于30个子查询,则会查询。显然,这不会非常有效。

替代方案取决于数据存储区的结构。如果您告诉我们您要实现的目标,我们可能会建议不需要这么多查询的替代方案。