(免責事項:これは非常にオープンな質問です。さらに、正解は1つだけではないと思います。とにかく閉じないでください。回答をコミュニティwikiに追加することも検討してください)
Ebean
メインの ORM として使用する Play アプリケーションに取り組んでいます。ローカル サーバーで開発モードにいる間、すべてが非常にうまくいきました。しかし、アプリケーションのターゲット環境は、クラウド + 離れた SQL サーバーです。ターゲット データベースに接続した後、ローカル環境では目に見えない 1 つのことがわかりましEbean
た。それは、手動で記述されたステートメントよりも何倍も長い時間、個別のクエリを実行することです。例:
声明
resultSet
このクエリは、〜 1200 ミリ秒で一連のサブクエリを実行します。
while (resultSet.next()) {
Statement innerStatement = connection.createStatement();
ResultSet innerSet
= innerStatement.executeQuery("SELECT title FROM media WHERE id='" + resultSet.getInt("id") + "'");
while (innerSet.next()) {
Logger.info("Statement: " + innerSet.getString("title"));
}
}
イービーン
同じ操作で約6500 ミリ秒の同じresultSet
Ebean
ニーズを使用します。(モデルには関係がないため、結合はありません):Media
while (resultSet.next()) {
Media media = Media.find.select("title").where().eq("id", resultSet.getInt("id")).findUnique();
Logger.info("Ebean: " + media.title);
}
編集: 一般的にすべてのクエリがはるかに高速であるため、ローカル環境の違いはそれほど素晴らしいものではありません。
もちろん、一連のクエリを単一のものに置き換えることができる場所はたくさんありますが、常に可能であるとは限りません。1 回のリクエストで複数の異なるテーブルをクエリする必要がある場合があります。他のケースでは、異なるデータベース間で数千のレコードを 1 つずつ照合する必要があります。
また、たとえば、Page<Media>
クラスが Play のビューに渡されると、そのリストの各項目に対して個別の選択が実行されることがわかりました。この場合getList()
、コントローラーでそれを渡しList<Media>
、通常のタイプのパラメーターを使用してページネーション用の情報を追加するのは簡単ですが...すべてを一度に取得するのはとてもクールでした:)
さて、質問は...
Ebean's
構成を最適化するにはどうすればよいですか?- どのようにクエリを最適化できますか (つまり、
List
の代わりに言及するか、ステートメントを使用して各オブジェクトを個別にフェッチする代わりにPage
使用します)。ほかに何か?find.where().in(..., ...)
for()
- Ebean で私たちを驚かせる可能性があるものは他にありますか (
Page
のアイテムを個別にクエリするなど)?