Запросы по ключу и итерации по объектам в AppEngine - PullRequest
0 голосов
/ 17 сентября 2011

Документы AppEngine отмечают, что «запросы, которые возвращают ключи, работают быстрее и стоят меньше ресурсов ЦП, чем запросы, которые возвращают полные сущности».

Какой из этих двух способов является наиболее желательным способом выборки и итерации по нескольким объектамиз хранилища данных?

query_keys = Person.all(keys_only=True)
query_keys.filter('name = ', person_name)
query_keys.order("__key__")

people = db.get(query_keys)                                                
for p in people:
   #read properties of the person object
   print p.name

Vs

query = Person.all()
query.filter('name = ', person_name)                   
query.order("__key__")

for p in people:
   #read properties of the person object
   print p.name

Ответы [ 3 ]

2 голосов
/ 19 сентября 2011

Обычный запрос выполняет по существу операции, которые выполняет ваш первый фрагмент, только внутри одного RPC. Если вам нужны сущности, более эффективно просто запросить их, чем запрашивать только ключи и получить сущности самостоятельно.

Единственное, на что следует обращать внимание - это перебирать объекты Query. Когда вы делаете это, базовый выбор уровня RPC приводит к получению данных из хранилища данных по 20 пакетов, что приводит к большому количеству ненужных RPC. Если вы знаете, сколько результатов вам нужно, вы должны вызвать fetch() для запроса (например, results = Person.all().filter('name =', 'Joe').fetch(100)), который будет выполнять только один RPC.

Appstats является отличным инструментом для обнаружения и диагностики таких проблем с производительностью.

1 голос
/ 17 сентября 2011

Запрос только по ключам дает вам ключи, а не сущность, которая имеет свойства. В первом примере p не будет иметь .name. Кроме того, порядок ключей неявный. Если вы хотите свойства от объекта, запрос только по ключу не то, что вы хотите; вам придется запросить объект. В настоящее время нет способа получить меньше, чем все свойства, поэтому учитывайте это при моделировании данных.

Вот третий вариант, который вы можете или не можете найти более читабельным. Он будет работать так же, как ваш второй фрагмент.

people = Person.gql("WHERE name=:1", person_name)
for person in people:
    print person.name

Независимо от того, используете ли вы этот подход или ваш второй фрагмент, запрос непосредственно для сущностей будет быстрее, чем запрос их ключей, а затем выборка сущностей, соответствующих этим ключам.

1 голос
/ 17 сентября 2011

Когда вы читаете полную сущность в любом случае , то второй путь будет, по крайней мере, не медленнее, чем первый.Возможно, это будет быстрее, потому что в нем меньше вызовов API

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...