15

私はこのようなクエリがあります。複数の注文プロパティが存在する場合、App EngineローカルSDK DBクエリを高速化しますか?

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')) 

..itは〜地元のSDKの10秒(長い100X)を取り、そしてクラウドで以前と同じ速度で動作します。私は2次プロパティを持つ必要があります。

セットアップに関するいくつかの詳細:

  • のWindows SDKのバージョン1.9.50
  • のPython 2.7
  • dbモデルを使用して、ないndb
  • 私は新鮮な地元のデータベースで開始しています(
  • 〜1200個のFooエンティティがローカルにあります(クラウドに3M〜)
  • 私はローカルDBにsqlite3 datastore.db "PRAGMA integrity_checkを実行し、エラーが

質問報告されていない:どのように私は、クエリをローカルで迅速に実行することができますか? (それは10Sで開発を行うことは本当に難しい全体の時間が遅れる。)

+0

fetch()を実行してPythonでソートした場合はどうなりますか? – GAEfan

+0

クラウド内でクエリは〜3M個のエンティティで実行されているので、可能ではなく、DBクエリでなければなりません。 – tom

+1

申し訳ありませんが、ローカルSDKに固有のように聞こえます – GAEfan

答えて

2

これは、あなたが望む答えではないかもしれないが、開発サーバ上の遅いデータストアのパフォーマンスがtracked on the public issue trackerされている長年の既知の問題です。

これが原因の1つの理由は、部分的にはエミュレーションの処理方法によるものです。 SDKのgoogle/appengine/datastore/datastore_sqlite_stub.pyを見ると、dbメソッドの呼び出しは、ローカルで実行されているSQLiteデータベースに入力される基本的なSQLクエリに変換されていることがわかります。

これらのケースでは、パフォーマンスを向上させるためにアプリケーションレベルで行うことはあまりありません。その解決策は、SDKが実装するSDKエンジニアリングチームにある開発サーバー上でよりスマートなクエリの変換を実行させることです。

関連する問題