Google App Engine:为什么仅键数据存储区查询花费我 1 READ 加 1 SMALL?

Google App Engine: Why are key-only datastore queries costing me 1 READ plus 1 SMALL?

我有一个 Google App Engine java 应用程序,它可以很好地满足我的需求,但我想针对数据存储操作成本进行优化。

我了解到小型数据存储操作是 free,并且从同一篇文章中了解到仅键查询使用小型操作...

Small datastore operations include calls to allocate datastore ids or keys-only queries

...所以我预计如果我进行仅键查询,并使用第一个检索到的键 'entity' 来获取完整的实体,那么它应该花费我 1 个小操作,再加上一个(大)读取操作总共 - 只有后者需要花钱。这与 this Stack Overflow 问题中使用的逻辑完全相同。如果我 运行 通过执行常规查询并获取第一个实体来做同样的事情,我将花费 1 + 1(大)读取。

但是...当我在我的应用程序上 运行 appstats 时,我看到查询花费我 1 Read,加上 1 small,然后我还必须为 get 付费:

@15ms datastore_v3.RunQuery real=8ms api=0ms cost=80 billed_ops=[DATASTORE_READ:1, DATASTORE_SMALL:1]

@6ms datastore_v3.Get real=7ms api=0ms cost=70 billed_ops=[DATASTORE_READ: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());

问题是:我是不是执行错了,或者我只是误解了定价的运作方式?谢谢。

您链接到的定价文档清楚地表明每个查询花费 1 次阅读。常规查询也会对每个实体收取 1 次读取费用,而仅键查询不会对每个实体收费。

因此,如果您想检索一个实体,使用仅键查询然后 get 检索实体的成本更高。如果您检索两个实体,它会变得均匀。如果要检索数千个实体,与常规查询相比,仅键查询基本上是免费的。

This Google 云平台博客中的新 post - 这是关于他们的新定价结构 - 实际上以书面形式阐明了旧定价应该如何适用于小型读取操作...

Small ops (projections and keys-only queries) will stay the same in only charging a single read for the entire query

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