Сколько операций чтения из Datastore потребляет каждая операция Fetch, Count и Query? - PullRequest
29 голосов
/ 18 октября 2011

Я читаю в группах Google App Engine многих пользователей ( Fig1 , Fig2 , Fig3 ), которые не могут определить, где большое числоЧтения хранилищ данных в их отчетах о выставлении счетов поступают из.
Как вы, возможно, знаете, Чтения хранилищ данных ограничены до 50 тыс. Операций в день, сверх этого бюджета вы должны платить.как много ресурсов, но, к несчастью, кажется, что каждая операция (Query, Entity fetch, Count ..) скрывает несколько операций чтения из Datastore.

Можно ли узнать через 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')

Ответы [ 2 ]

10 голосов
/ 14 ноября 2011

См. 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

По возможности вы должны использовать курсоры вместо смещения.

3 голосов
/ 13 января 2012

Просто чтобы убедиться:

Я почти уверен:

Example.all().count(10000)

В этом случае используются небольшие операции с хранилищем данных (не нужно извлекать объекты, только ключи), поэтому это будет считаться как 1 чтение + 10000 (макс.) Мелких операций.

...