15

У меня есть запрос, который выглядит следующим образом:Ускорить запрос локального SDK DB приложения 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')) 

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

Несколько подробнее об установке:

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

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

+0

Что делать, если вы сделали fetch() и отсортированы в python? – GAEfan

+0

В облаке запрос работает над ~ 3M сущностями, так что это было бы невозможно, это должен быть запрос БД. – tom

+1

Извините, вопрос звучит как локальный SDK – GAEfan

ответ

2

Это не может быть ответом, который вы хотите, но низкая производительность хранилища данных на сервере разработки является давней известной проблемой, которая в настоящее время tracked on the public issue tracker.

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

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

Смежные вопросы