2016-05-10 16 views
1

に参加し、サブクエリは、私は次のクエリを持って非常に遅い

SELECT * FROM users, 
(SELECT * 
FROM mastery 
WHERE champion_rank = 1 
ORDER BY global_rank ASC 
LIMIT 3) as ranks 
WHERE users.id = ranks.user_id 

マスタリーは22M行とユーザーがいる500万行を持っています。上記のクエリは1800msで完了します。

問題は、それ自体で実行すると、サブクエリ次だから、理論的にもし2.5msで

SELECT * FROM users WHERE id = 4234523 

SELECT * 
FROM mastery 
WHERE champion_rank = 1 
ORDER BY global_rank ASC 
LIMIT 3 

を実行するために、ユーザーテーブルから単一のユーザーを取得するために、2.5msでかかりかかることです私はちょうど最初のサブクエリを行うために自分のコードを変更し、その後、返された各行に対して、処理全体が2.5 +(3 * 2.5)= 10ミリ秒かかるという追加クエリを実行します。

確かにpostgresは何か変わったことをしていますか?

構造とデータベースのインデックスが、それはユーザーが500万行の上でそれぞれにソートされたサブクエリを実行する必要があるためhere

+2

なぜ結合を使用しないのですか?また、テーブルにインデックスを置いていますか? – JanR

+0

http://stackoverflow.com/tags/postgresql-performance/infoとhttp://wiki.postgresql.org/wiki/SlowQueryQuestionsを読んで質問を編集し、不足している情報を追加してください –

答えて

0

あなたのクエリが遅い実行されています。

ジョイン単一のパスをやってオフにはるかに良い、とあなたが望む3つのトップのものをフィルタリングするためのランク()窓関数を使用します。

​​
+0

ありがとうございますmastery.user_idとusers.idのデータ型を同じに変更することでこれを解決しましたが、これはやや性能が向上しています。 100%理解していないが、仕事から家に帰るときに試してみよう。 – jromaior

0

は、2つのフィールドのデータ型を問題を決定参加していたのは違っていた。マスタイのユーザーIDはデータ型数値で、ユーザーIDはデータ型整数で、各行を新しい型にキャストしていなければなりません。

したがって、長いクエリ時間。

+0

あなたの質問にそれを追加していれば、実行計画で見たことがあるものは何か。 –

+0

私は間違いなくpostgresの専門家ではなく、私は質問のEXPLAIN ANALYZEを見ましたが、それは直感的にこれが問題であることを理解することができませんでしたが、これは主に私のpostgresの経験がないことによると思います – jromaior

+0

私はあなたの最初の質問に実行計画を追加する必要があります。おそらく誰かがそれをすぐに見つけただろう。 –

関連する問題