2017-02-08 45 views
15

我有一個查詢,看起來像這樣:在可接受的速度當存在多個訂單屬性時加快App Engine本地SDK數據庫查詢的速度?

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秒(100X更長),並在雲中之前以相同的速度運行。我需要有二階屬性。

有關安裝的一些細節:

  • 的Windows SDK版本50年1月9日
  • 的Python 2.7
  • 使用db模式,而不是ndb
  • 我已經開始用新鮮的本地數據庫(替換datastore.db)並重新創建記錄
  • 本地有〜1200個Foo實體(在雲中〜3M)
  • 我在本地數據庫運行sqlite3 datastore.db "PRAGMA integrity_check,據報道

問題沒有錯誤:我怎樣才能使查詢運行更快的本地? (開發的時間非常困難,在整個過程中有10秒的延遲。)

+0

如果你做了一個fetch()並在python中進行了排序呢? – GAEfan

+0

在雲中,查詢運行在〜3M實體上,因此不可能,它必須是DB查詢。 – tom

+1

對不起,這個問題聽起來像是特定於本地SDK – GAEfan

回答

2

這可能不是您想要的答案,但是開發服務器上的數據存儲性能降低是一個長期存在的已知問題,它正在爲tracked on the public issue tracker

爲什麼出現這種情況的一個原因是部分原因是如何處理仿真。如果您在SDK中查看google/appengine/datastore/datastore_sqlite_stub.py,可以看到對db方法的調用有點天真地轉換爲基本的SQL查詢,這些查詢被饋送到本地運行的SQLite數據庫中。

在應用程序級別上,您可以做的不多,以提高這些情況下的性能。解決方案是讓SDK在開發服務器上執行更智能的查詢翻譯,SDK開發團隊將執行該查詢。

相關問題