29

我正在閱讀Google App Engine組中的許多用戶(Fig1,Fig2,Fig3),他們無法確定數據存儲的大量數據存儲在其結算報告中的讀數來自何處。
正如您所知,Datastore reads的上限爲每天5萬次操作,超出此預算需要支付。有多少數據存儲區讀取消耗每個讀取,計數和查詢操作?

50K操作聽起來像很多資源,但不幸的是,似乎每個操作(Query,Entity fetch,Count ..)隱藏了多個Datastore讀取。

是否可以通過API或其他方法知道有多少數據存儲區讀取隱藏在通用RPC.get,RPC.runquery調用之後?

Appstats在這種情況下似乎沒用,因爲它只給出了RPC細節而不是隱藏的讀取成本。

有一個簡單的模型是這樣的:

class Example(db.Model): 
    foo = db.StringProperty()  
    bars= db.ListProperty(str) 

和實體在數據存儲中,我感興趣的是這幾樣操作的成本:

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

我認爲每個返回的實體都是一個讀取,如果你有一個ref的道具,那麼你第一次訪問它也是一個讀取。請注意,提取(X)並不意味着如果計數太高,則會返回X個實體,那麼它將以批量處理,並且每個批量將計爲數據讀取(批量大小)。我不知道count(X)如何在數據讀取方面工作,它應該算作單個讀取,但它是一個一廂情願的想法。 –

回答

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() 

使用count你相反的應該考慮將計數存儲在數據存儲中,如果您需要每秒更新一次計數,則分片。 http://code.google.com/appengine/articles/sharding_counters.html

只要有可能,你應該使用光標而不是偏移量。

+0

我看不到您發佈的鏈接中的任何引用,它返回的每個實體的成本爲1讀,實際上我沒有看到任何提及的數據存儲讀取。 –

+0

糟糕,我粘貼了錯誤的鏈接。我現在修復了它 – ribrdb

3

只是爲了確保:

我幾乎可以肯定:

Example.all().count(10000) 

這一個使用小數據存儲區操作(無需取實體,只是鍵),因此這隻能算作1讀+ 10,000(最大)小操作。

+0

你是對的 - 「小型操作」受到上述表達式的影響,而不是「讀取操作」。剛剛檢查了GAE項目。 –