Сохраняет ли пакетная обработка db.get (keys) порядок ключей? - PullRequest
1 голос
/ 23 февраля 2009

Google App Engine поддерживает операцию выборки на основе списка ключей google.appengine.ext.db.get ( keys ) .

Мне было бы интересно выяснить, есть ли какая-либо гарантия, что список результатов сохраняет порядок ключей (то есть keys = [k_1, k_2, k_3], затем для результата [r_1, r_2, r_3] всегда верно, что r_i .key () == k_i).

Насколько я знаю, API выполняет выбор IN путем внутренней выдачи N суб-выбора для каждого значения в IN. Я ожидаю, что это произойдет для db.keys, и поэтому вызов сохранит порядок ключей.

В любом случае, я не уверен, и я не могу найти никаких ссылок на то, что db.keys эквивалентно выбору IN, хотя и если нет никаких оптимизаций для его выполнения на месте. В противном случае обходной путь был бы довольно простым (я бы повторял и запрашивал себя для каждого ключа, и поэтому у меня будет гарантия, что я не буду зависеть от реализации db.keys).

Я провел несколько базовых тестов, и результаты показывают, что:

  1. db.get() показывает лучшие результаты
  2. db.get() сохраняет порядок ключей
  3. альтернатива Model.<code>get_by_id (для которой порядок результатов всегда будет гарантирован) выполняется медленнее

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

ТИА, ./alex

Проводя дополнительные исследования, я обнаружил следующее (документация для db.get() и Model.get():

Если ids является списком, метод возвращает список экземпляров модели со значением None, если для соответствующего ключа не существует сущности.

Даже если это не подчеркивает, я думаю, что ясно, что заказ гарантирован.

Ответы [ 2 ]

3 голосов
/ 23 февраля 2009

Вы правы: db.get возвращает сущности в том же порядке, что и ключи, которые вы указали. Разница в производительности, которую вы наблюдаете, заключается в том, что он должен совершать только одну передачу в базу данных вместо нескольких, а также потому, что он может одновременно извлекать все объекты, а не действовать последовательно. Однако это не эквивалентно «SELECT ... IN ...», поскольку оно основано на Bigtable, и вы выбираете первичный ключ, поэтому он может выполнять поиск непосредственно в таблице.

При сравнении производительности нужно учитывать одну вещь: Всегда делать это на рабочем сервере, а не на dev_appserver. Оба имеют совершенно разные рабочие характеристики.

0 голосов
/ 23 февраля 2009

Цитата из документации проясняет мой вопрос.

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