Оптимизация производительности запросов на присоединение в Google App Engine - PullRequest
1 голос
/ 24 марта 2011

Сценарий

  • Entity1 (id, itmname)

  • Entity2 (id, itmname, цена)

  • Entity3 (id, itmname, прибыль)

  • прибыль и цена оба IntegerProperty

Я хочу посчитать весь товар с ценой более 500 и прибылью более 10.

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

Причиной неисполнения запросов по отдельности является время выполнения запроса.В каждом запросе я получаю более 50000 записей в результате, поэтому получение записей из первого запроса занимает около 20 секунд.

Ответы [ 2 ]

1 голос
/ 24 марта 2011

Разработчики Google App Engine всегда фокусировались на оптимизации чтения, и это одна из вещей, где появляется денормализация. Прежде чем разрабатывать структуру данных, вы должны поработать над возможными случаями, когда данные могут быть извлечены.Проектирование моделей происходит позже.Подробное рассмотрение сеанса ввода-вывода о построении масштабируемых веб-приложений с помощью Google App Engine окажется полезным.

В текущей ситуации, если вас интересует просто отсчет, вы можете пойти с счетчик осколок .Вам потребуется обновить каждый связанный счетчик, если поле обновляется.

Другой подход включает выполнение запланированной на ночь задачи, которая будет выполнять сложные вычисления, а также обновлять счетчики и другую статистику, которая может вам понадобиться.В этом случае вам может пригодиться mapreduce .Такой подход никогда не даст вам данных в реальном времени.

0 голосов
/ 24 марта 2011

Стандартным решением этой проблемы является денормализация.Попробуйте сохранить копии price и profit в Entity1, и тогда вы сможете ответить на свой вопрос одним простым запросом на Entity1.

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