2017-08-31 2 views
1

私はPostgres 9.6を使用しています。私はstoryslideという2つのテーブルを持っています:slideは、storyへの外部キーを持っています。JOINの前または後にフィールドを抽出するのが好ましいですか?

標準の間のパフォーマンスの面で違いがこのようなクエリのJOINあり:

SELECT story.*, slide.name, slide.story_id 
FROM story 
JOIN slide ON story.id=slide.story_id 
WHERE slide.index=0; 

そして、最初の関心のフィールドを抽出し、だけにして、それらを結合し、このようなサブクエリ、:

SELECT story.*, slide.name, slide.story_id 
FROM story 
JOIN (SELECT * FROM slide WHERE index=0) slide 
ON story.id=slide.story_id; 

私はEXECUTION ANALYSEの出力を見てきましたが、どちらもまったく同じ実行計画があるようです。

パフォーマンス用語に違いがない場合は、他のものよりも文体的に好まれますか?

+0

バージョン1のほうがはるかに優れています。 – jarlh

+2

パフォーマンスの違いがあるとは思っていません。私は最初のバージョンを好む。私はちょうどSELECT *を使用しないことをお勧めします。代わりに列名のリストを使用します。 – etsa

答えて

1

第1のものは、好ましくは文体的に好ましい。 。念のため。

SELECT st.*, sl.name, 
     sl.story_id -- unnecessary 
FROM story st JOIN 
    slide sl 
    ON st.id = sl.story_id 
WHERE sl.index = 0; 

そして、なぜあなたはsl.story_idを選択している:私は表の別名を使用してそれを書くのでしょうか?それはちょうどst.idを繰り返す。

データベースがサブクエリ(Postgresではなく、少なくともすべてではない)を具体化するため、「追加のオーバーヘッド」が発生するためです。さらに、サブクエリは実際にロジックを理解しやすくするために何も追加しません。私は副問合せの大ファンですが、それらを不必要に使用するわけではありません。

関連する問題