Сколько записей Datastore потребляет каждую операцию Fetch, Count и Query?
Я читаю в группах Google App Engine много пользователей (Fig1, Fig2, Fig3), которые не могут определить, где большое количество Datastore читает в своих отчетах о выставлении счетов,.
Как вы, возможно, знаете, Datastore читает, ограничены до 50K операций/день, над этим бюджетом вы должны платить.
Операции 50K звучат как много ресурсов, но, к несчастью, кажется, что каждая операция (Query, Entity fetch, Count..) скрывает несколько файлов Datastore.
Можно ли узнать через API или какой-либо другой подход, сколько записей Datastore скрыто за общими вызовами 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')
Ответы
Ответ 1
См. 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
По возможности вы должны использовать курсоры вместо смещения.
Ответ 2
Просто, чтобы убедиться:
Я почти уверен:
Example.all().count(10000)
В этом случае используются небольшие операции с хранилищем данных (нет необходимости извлекать сущности, только ключи), поэтому это будет считаться 1 считанной + 10 000 (макс.) небольших операций.