Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 谷歌应用程序引擎:为什么仅关键数据存储查询花费我1读加1小?_Java_Google App Engine_Google Cloud Datastore - Fatal编程技术网

Java 谷歌应用程序引擎:为什么仅关键数据存储查询花费我1读加1小?

Java 谷歌应用程序引擎:为什么仅关键数据存储查询花费我1读加1小?,java,google-app-engine,google-cloud-datastore,Java,Google App Engine,Google Cloud Datastore,我有一个GoogleAppEngineJava应用程序,它可以很好地满足我的需求,但我想优化数据存储操作成本 我理解小型数据存储操作是,并且从同一篇文章中可以看出,仅键查询使用小型操作 小型数据存储操作包括分配数据存储ID或仅密钥查询的调用 。。。因此,我预计如果我执行一个仅键查询,并使用第一个检索到的“实体”中的键来获取完整的实体,那么它将花费我1个小操作,加上一个(大)读取操作-仅后者需要花费金钱。这与堆栈溢出问题中使用的逻辑完全相同。如果我只是通过执行常规查询并获取第一个实体来运行相同的操

我有一个GoogleAppEngineJava应用程序,它可以很好地满足我的需求,但我想优化数据存储操作成本

我理解小型数据存储操作是,并且从同一篇文章中可以看出,仅键查询使用小型操作

小型数据存储操作包括分配数据存储ID或仅密钥查询的调用

。。。因此,我预计如果我执行一个仅键查询,并使用第一个检索到的“实体”中的键来获取完整的实体,那么它将花费我1个小操作,加上一个(大)读取操作-仅后者需要花费金钱。这与堆栈溢出问题中使用的逻辑完全相同。如果我只是通过执行常规查询并获取第一个实体来运行相同的操作,那么我将花费1+1(大)读取

但是。。。当我在我的应用程序上运行appstats时,我看到的是,查询要花费我1次读取,加上1次小查询,然后我还必须为获取付费:

@15ms数据存储\u v3.RunQuery real=8ms api=0ms成本=80计费\u操作=[数据存储读取:1,数据存储小:1]

@6ms数据存储\u v3.Get real=7ms api=0ms成本=70计费\u操作=[数据存储\u读取:1]

。。。因此,这比我预期的多花费了我1次阅读,和我以前做的相比,多了1次小手术

java代码的示例位如下所示:

Query query = new Query(<Entity Name>).setKeysOnly();
Filter filter = new FilterPredicate(<Field Name>, Query.FilterOperator.EQUAL, <Some Value>);
query.setFilter(filter);
List<Entity> resultsSet = datastore.prepare(query).asList(FetchOptions.Builder.withLimit(<Max Rows>));
Entity entity = datastore.get(resultsSet.get(0).getKey());
Query Query=new Query().setKeysOnly();
Filter Filter=new FilterPredicate(,Query.FilterOperator.EQUAL,);
setFilter(filter);
List resultset=datastore.prepare(query).asList(FetchOptions.Builder.withLimit());
实体=datastore.get(resultset.get(0.getKey());

问题是:我实施这一点是错误的,还是我只是误解了定价的工作原理?谢谢。

您链接到的定价文档清楚地表明,每个查询都需要阅读一次。常规查询还需要每个实体读取1次,而仅键查询不需要每个实体付费

因此,如果要检索一个实体,使用仅键查询,然后使用
get
检索该实体的成本更高。如果检索到两个实体,它将达到平衡。如果你想检索数千个实体,与常规查询相比,只需按键的查询基本上是免费的。

谷歌云平台博客上的新帖子——关于他们新的定价结构——实际上以书面形式澄清了旧的定价在小读操作中的作用

小型ops(仅投影和密钥查询)将保持不变,只对整个查询的一次读取收费


因此,这证实了/提供了其他人所说的信息来源-仅关键查询只需一次阅读-并且旧的定价文档不是很清楚/具有误导性!但现在一切都没有意义了,因为从7月份起,价格正在发生变化

你有两个问题。第一个是
datastore.prepare(query).asList(FetchOptions.Builder.withLimit()).get(0.getKey()
,第二个是
datastore.get(key)。是的,明白了。但问题是:为什么只有keysOnly查询(第一个)需要一次小的读取,加上一次(常规的)读取——而文档中说“小数据存储操作包括。。。仅键查询'?get(第二个“查询”)需要一次(常规)读取,这一事实正是我所期望的。一个过滤器通常需要一个排序操作,而不是一个小操作。我会试着为它找到一个文档链接。真的吗?我在文档中没有看到任何表明这一点的内容。它必须使用索引属性,否则查询将根本无法工作——在本例中,它将是内置索引之一,而不是复合索引。“对键的查询与对属性的查询一样使用索引,在相同的情况下需要自定义索引,但有两个例外:不平等筛选器或键的升序排序顺序不需要自定义索引,但键的降序排序顺序需要自定义索引。”(来源:)我想知道这是否有很大帮助……对不起,我找不到比这更多的东西,但这听起来像是一个常规的筛选操作。谢谢。它确实明确表示常规查询需要1次常规读取,每个返回的实体加上一次。但它也明确表示“小型数据存储操作包括…只包含键的查询”。因此它说了两件事,要么是含糊不清的,要么是共同的你是说我应该理解文档的意思是:“小型数据存储操作包括。。。作为仅密钥查询的一部分返回的密钥(但实际查询仍需花费1读)”?我可以问:您是否明确地告诉我这就是定价的目的,或者您只是给我您对文档内容的解释?(顺便说一句:我认为至少还有两个堆栈溢出答案与这个答案相矛盾——一个是我上面引用的答案,另一个是).在文档和您发布的日志之间,这一点非常清楚。此外,我在谷歌的一篇帖子中读到了这一点。请注意,10000000个只需按键的查询需要花费6美元,那么您到底想节省什么?您是否已经像十亿个这样的查询一样运行?您是否有到谷歌帖子的链接?这将明确回答问题问题,谢谢。