每次获取,计数和查询操作会占用多少数据存储读取?

时间:2011-10-18 12:55:36

标签: google-app-engine profiling rpc google-cloud-datastore billing

我正在Google App Engine上阅读许多用户(Fig1Fig2Fig3),他们无法确定数据存储区在其结算报告中的大量读取位置来自。
您可能知道,Datastore reads的上限为每天50K操作,高于您必须支付的预算。

50K操作听起来像很多资源,但不幸的是,似乎每个操作(Query,Entity fetch,Count ..)都隐藏了几个数据存储读取。

是否可以通过API或其他方法了解在常见的RPC.getRPC.runquery调用后隐藏了多少数据存储读取?

在这种情况下,

Appstats似乎没用,因为它只提供RPC详细信息,而不是隐藏的读取成本。

拥有一个这样的简单模型:

class Example(db.Model):
    foo = db.StringProperty()    
    bars= db.ListProperty(str)
数据存储区中的

1000 实体,我对这类操作的成本感兴趣:

items_count =  Example.all(keys_only = True).filter('bars=','spam').count()

items_count = Example.all().count(10000) 

items = Example.all().fetch(10000)

items = Example.all().filter('bars=','spam').filter('bars=','fu').fetch(10000)

items = Example.all().fetch(10000, offset=500)

items = Example.all().filter('foo>=', filtr).filter('foo<', filtr+ u'\ufffd')

2 个答案:

答案 0 :(得分:10)

http://code.google.com/appengine/docs/billing.html#Billable_Resource_Unit_Cost。 对于返回的每个实体,查询花费1读取加1读取。 “返回”包括由偏移或计数跳过的实体。 所以这是每个1001读取:

Example.all(keys_only = True).filter('bars=','spam').count() 
Example.all().count(1000)
Example.all().fetch(1000)
Example.all().fetch(1000, offset=500)

对于这些,收取的读数是1加上与过滤器匹配的实体数量:

Example.all().filter('bars=','spam').filter('bars=','fu').fetch()
Example.all().filter('foo>=', filtr).filter('foo<', filtr+ u'\ufffd').fetch()

您应该考虑将计数存储在数据存储区中,而不是使用计数,如果您需要每秒更新一次计数,则需要进行分片。 http://code.google.com/appengine/articles/sharding_counters.html

尽可能使用游标而不是偏移量。

答案 1 :(得分:3)

只是为了确保:

我几乎可以肯定:

Example.all().count(10000)

这个使用小型数据存储区操作(不需要获取实体,只需要键),因此这将被视为1次读取+ 10,000次(最大值)小型操作。