2011-02-15 62 views
6

我想只要確認SQL查詢使用LEFT(外部)連接時,連接中的表的順序是否重要?

SELECT .... 
    FROM apples, 
     oranges 
     LEFT JOIN kiwis ON kiwis.orange_id = oranges.id, 
     bananas 
WHERE .... 

完全等同於from子句其他排列,像

SELECT .... 
    FROM oranges 
     LEFT JOIN kiwis ON kiwis.orange_id = oranges.id, 
     bananas, 
     apples 
WHERE .... 

SELECT .... 
    FROM bananas, 
     apples, 
     oranges 
     LEFT JOIN kiwis ON kiwis.orange_id = oranges.id 
WHERE .... 

爲明確桔子和獼猴桃之間的左連接保持完好。從我讀過的各種文檔中,返回的集合應該完全相同。

我真的只關心查詢的結果,而不是在實際數據庫中的性能。 (我使用的是PostgreSQL 8.3,AFAIK不支持關於連接順序的優化器提示,並會嘗試自動創建最佳查詢計劃)。

+0

你測試了嗎? 'JOIN'的順序是無關緊要的,除非你需要以前'JOIN'的具體結果 – Matthew 2011-02-15 21:24:04

+0

香蕉,蘋果,桔子是笛卡爾產品嗎?或「加入WHERE」子句? – gbn 2011-02-15 21:34:15

+1

EXPLAIN將向您展示:http://www.postgresql.org/docs/current/static/sql-explain.html並且沒有任何提示的理由,PostgreSQL非常聰明。 – 2011-02-15 21:41:46

回答

15

它是一樣的,但它與地獄隱含 CROSS JOINs模糊不清。使用顯式連接。

如果您加入WHERE子句,那麼結果可能不同,因爲連接和過濾器混在一起。

SELECT .... 
    FROM apples a 
     JOIN 
     bananas b ON ... 
     JOIN 
     oranges o ON ... 
     LEFT JOIN 
     kiwis k ON k.orange_id = o.id 
WHERE (filters only) 

注:

  • 內部連接和交叉連接的交換和關聯:爲了無所謂一般。
  • OUTER JOINS不是,您確定了它
  • SQL是聲明式的:您告訴優化器您想要什麼,而不是如何去做。這刪除了JOIN順序考慮事項(受前2項限制)
0

我已經爲驢年完成了SQL,並且根據我的經驗,表順序無關緊要。數據庫將查看整個查詢並創建最佳查詢計劃。這就是爲什麼數據庫公司僱用很多擁有博士學位的人員進行查詢計劃優化的原因。

如果數據庫供應商按您在查詢中親自列出SQL的順序進行優化,則會進行商業自殺。

1

這種情況總結在Controlling the Planner with Explicit JOIN Clauses。外連接不重排,內連可以。你可以在運行查詢之前先刪除* join_collapse_limit *來強制執行特定的優化程序,然後按照你想要的順序放置它們。這就是你如何「暗示」這個領域的數據庫。

通常,您想使用EXPLAIN來確認您得到的順序,並且有時可以用於直觀地確認兩個查詢得到相同的計劃。