我正在Google App Engine上阅读许多用户(Fig1,Fig2,Fig3),他们无法确定数据存储区在其结算报告中的大量读取位置来自。
您可能知道,Datastore reads的上限为每天50K操作,高于您必须支付的预算。
50K操作听起来像很多资源,但不幸的是,似乎每个操作(Query,Entity fetch,Count ..)都隐藏了几个数据存储读取。
是否可以通过API或其他方法了解在常见的RPC.get
,RPC.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')
答案 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次(最大值)小型操作。