2017-01-20 20 views
0

複数の結合を使用してSQLクエリを高速化する助けをしたいと思います。私が取り出そうとしているのは、最新の対応するページ、アイテム、クラブを持つすべてのユーザーフィールドに相当します。以下のクエリは問題なく動作しますが、数秒かかることがあります。 user_idのすべての外部キーフィールド、Userクラス、およびそれがフィルタリングしている大学のフィールドにインデックスを追加しましたが、それほど助けにはなりませんでした。複数の左外部結合SQLクエリの高速化

私はすべてのユーザーを取得したいので、私は単純な内部結合を行うことはできませんと考えています。各ユーザーには、0ページから多くのページ、アイテム、およびクラブがあります。私はあなたが適切なインデックスとクエリを向上させることができると思い

SQLテーブル

User 
id 
first_name 
last_name 
class 
college 

Page 
id 
user_id 
created_at 
page_text 

Item 
id 
user_id 
created_at 
item_text 

Club 
id 
user_id 
created_at 
club_text 

現在の作業が、スロークエリ

SELECT u.id,u.first_name,u.last_name,p.page_text,i.item_text,c.club_text FROM user u LEFT OUTER JOIN LATERAL \ 
    (SELECT page_text FROM page p2 WHERE u.id = p2.user_id ORDER BY p2.created_at DESC LIMIT 1) p ON TRUE LEFT OUTER JOIN LATERAL \ 
    (SELECT item_text FROM item i2 WHERE u.id = i2.user_id ORDER BY i2.created_at DESC LIMIT 1) i ON TRUE LEFT OUTER JOIN LATERAL \ 
    (SELECT club_text FROM club c2 WHERE u.id = c2.user_id ORDER BY c2.created_at DESC LIMIT 1) c ON TRUE \ 
    WHERE u.class = 'Senior' AND u.college = 'University' ORDER BY u.first_name; 

答えて

0

SELECT u.id, u.first_name ,u.last_name, p.page_text, i.item_text, c.club_text 
FROM user u LEFT OUTER JOIN LATERAL 
    (SELECT page_text 
     FROM page p2 
     WHERE u.id = p2.user_id 
     ORDER BY p2.created_at DESC 
     LIMIT 1 
    ) p ONTRUE LEFT OUTER JOIN LATERAL 
    (SELECT item_text 
     FROM item i2 
     WHERE u.id = i2.user_id 
     ORDER BY i2.created_at DESC 
     LIMIT 1 
    ) i ON TRUE LEFT OUTER JOIN LATERAL 
    (SELECT club_text 
     FROM club c2 
     WHERE u.id = c2.user_id 
     ORDER BY c2.created_at DESC 
     LIMIT 1 
    ) c ON TRUE 
WHERE u.class = 'Senior' AND u.college = 'University' 
ORDER BY u.first_name; 

複合(マルチカラム)あなたが望むインデックスは:

  • user(class, college, first_name, id)
  • page(user_id, created_at desc, page_text)
  • item(user_id, created_at desc, item_text)
  • club(user_id, created_at desc, club_text)
+0

おかげで、私が思ったように私は、外部キーのインデックスを作成しなかっ判明私は持っていた。修正後、クエリの速度が大幅に向上します。これらのフィールドで、まだインデックスされている他の列に基づいて検索する以外の理由から、ページ(page_text)、アイテム(item_text)、およびクラブ(club_text)のインデックスが必要な理由を説明できますか? – user1071182

+0

@ user1071182 。 。これらの単一列索引がなぜ役立つのかわかりません。 –

+0

おそらく私はあなたの返事を誤解していて、私は今では – user1071182

0

ただ、単純にそれを試してみてください。

select * 
from (
    select distinct on (u.id) 
     u.id, u.first_name, u.last_name, p.page_text, i.item_text, c.club_text 
    from 
     user u 
     left outer join page p on p.user_id = u.id 
     left outer join item i on i.user_id = u.id 
     left outer join club c on c.user_id = u.id 
    where u.class = 'Senior' and u.college = 'University' 
    order by u.id, p.created_at desc, i.created_at desc, c.created_at desc 
) s 
order by last_name, first_name; 
関連する問題