我有一个如下所示的查询:
query = (models.Foo.all()
.filter('x =', x)
.filter('y =', y)
.filter('z =', z)
.filter('zz =', zz)
.order('-a'))
它在~100ms内在本地SDK上运行,并以可接受的速度在云中运行。 当我添加第二个订单时(所以看起来像这样:):
query = (models.Foo.all()
.filter('x =', x)
.filter('y =', y)
.filter('z =', z)
.filter('zz =', zz)
.order('-a')
.order('-b'))
..在本地SDK上需要大约10秒(长100倍),并且在云中以与之前相同的速度运行。我需要有二阶属性。
有关设置的一些细节:
db
模型,而不是ndb
sqlite3 datastore.db "PRAGMA integrity_check
并且没有报告错误问题:如何在本地更快地运行查询? (在整个时间里,10s滞后的开发真的很困难。)
答案 0 :(得分:2)
这可能不是您想要的答案,但是在开发服务器上缓慢的数据存储性能是一个长期存在的已知问题,即tracked on the public issue tracker。
这种情况的一个原因部分是由于如何处理仿真。如果您查看SDK中的google/appengine/datastore/datastore_sqlite_stub.py
,您可以看到对db
方法的调用有点天真地转换为基本的SQL查询,这些查询被送入本地运行的SQLite数据库。
在应用程序级别,您无法做很多事情来提高这些情况下的性能。解决方案是让SDK在开发服务器上执行更智能的查询转换,这是SDK工程团队要实现的。