2017-08-31 26 views
1

我使用的是Postgres 9.6。我有兩個表,storyslideslide有一個外鍵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

第一個是最好的風格。 。以防萬一。

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,至少不是所有的時間) - 並增加了額外的開銷。另外,子查詢確實沒有增加邏輯的可理解性。我是子查詢的忠實粉絲,但不是不必要地使用它們。

相關問題