2

Movie約 15,000 アイテムのモデルDvdと 3500 のモデルがあります。

次のクエリは、Heroku で実行されている Crane Postgres db を使用した単純な Rails 関連付けです。次のクエリに時間がかかる理由と、最終的に時間を短縮するにはどうすればよいか疑問に思っています。

2012-10-24T05:42:19+00:00 app[postgres]: [30-1] [BLACK] LOG:  duration: 57.914 ms  statement: SELECT  "movies".* FROM "movies"  WHERE "movies"."dvd_id" = 37 ORDER BY scene LIMIT 1
2012-10-24T05:42:20+00:00 app[postgres]: [31-1] [BLACK] LOG:  duration: 77.086 ms  statement: SELECT  "movies".* FROM "movies"  WHERE "movies"."dvd_id" = 915 ORDER BY scene LIMIT 1
2012-10-24T05:42:20+00:00 app[postgres]: [32-1] [BLACK] LOG:  duration: 85.602 ms  statement: SELECT  "movies".* FROM "movies"  WHERE "movies"."dvd_id" = 108 ORDER BY scene LIMIT 1
2012-10-24T05:42:21+00:00 app[postgres]: [33-1] [BLACK] LOG:  duration: 70.147 ms  statement: SELECT  "movies".* FROM "movies"  WHERE "movies"."dvd_id" = 11 ORDER BY scene LIMIT 1
2012-10-24T05:42:21+00:00 app[postgres]: [34-1] [BLACK] LOG:  duration: 144.204 ms  statement: SELECT  "movies".* FROM "movies"  WHERE "movies"."dvd_id" = 6 ORDER BY scene LIMIT 1
2012-10-24T05:42:22+00:00 app[postgres]: [35-1] [BLACK] LOG:  duration: 56.623 ms  statement: SELECT  "movies".* FROM "movies"  WHERE "movies"."dvd_id" = 1956 ORDER BY scene LIMIT 1
2012-10-24T05:42:23+00:00 app[postgres]: [36-1] [BLACK] LOG:  duration: 64.860 ms  statement: SELECT  "movies".* FROM "movies"  WHERE "movies"."dvd_id" = 747 ORDER BY scene LIMIT 1
4

4 に答える 4

4

これらのクエリを担当するコードは何ですか? 熱心な読み込みを使用していますか? クエリは次のようになります。

DVD.includes(:movies).where(whatever) #DVD に多数のムービーがあると仮定

これにより、クエリ/リクエストの数が減るはずです。あなたのデータベースに。あなたのクエリは、N+1 の問題がある可能性があることを示唆しています。

dvd_id は外部キーであるため、movies テーブルにもデータベース インデックスが必要です。

于 2012-10-24T06:24:36.477 に答える
4

データベース CLI に直接接続し、PostgresQLEXPLAINコマンドを使用してクエリの実行方法に関する情報を取得できます。これにより、テーブルにインデックスを追加して処理を高速化できる場所を示すことができます。Postgres のドキュメントEXPLAINでは、より詳細に説明されています (私が何をしたかを参照してください) 。

于 2012-10-24T05:58:05.760 に答える
0

少なくとも dvd_id にインデックスがあることを確認してください。(dvd_id, scene) に複合インデックスを作成できる場合、クエリは完全に最適化され、それ以上最適化することはできません。

つまり、実行するだけです

CREATE INDEX movies_dvd_id_scene_idx ON movies (dvd_id, scene);

これで準備完了です

于 2012-10-24T06:30:54.807 に答える