Ускорить запрос локального SDK-сервера App Engine при наличии нескольких свойств заказа?

У меня есть запрос, который выглядит так:

query = (models.Foo.all()
  .filter('x =', x)
  .filter('y =', y)
  .filter('z =', z)
  .filter('zz =', zz)
  .order('-a'))

Он работает на локальном SDK в ~ 100 мс и работает в облаке на приемлемых скоростях. Когда я добавляю второй порядок (это выглядит так:)

query = (models.Foo.all()
  .filter('x =', x)
  .filter('y =', y)
  .filter('z =', z)
  .filter('zz =', zz)
  .order('-a')
  .order('-b'))

.. для локального SDK требуется ~ 10 с (100 раз) и работает на той же скорости, что и раньше, в облаке. Мне нужно иметь свойство второго порядка.

Несколько сведений о настройке:

  • Версия SDK Windows 1.9.50
  • Python 2.7
  • Используя модель db, а не ndb
  • Я начал с новой локальной базы данных (заменил datastore.db) и перестроил записи с нуля
  • Существует локально локально локально локально (~ 3M в облаке) ~ 1200 Foo.
  • Я запустил sqlite3 datastore.db "PRAGMA integrity_check на локальном db и никаких ошибок не сообщалось

Вопрос: как я могу заставить запрос запускаться быстрее локально? (Это действительно сложно сделать развитие с 10-секундным отставанием там все время.)

Ответ 1

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

Одна из причин, почему это так, частично объясняется тем, как обрабатывается эмуляция. Если вы посмотрите на google/appengine/datastore/datastore_sqlite_stub.py в SDK, вы увидите, что вызовы методов db несколько наивно переведены на базовые SQL-запросы, которые загружаются в локально запущенную базу данных SQLite.

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