2009-09-29 60 views
0

前提是表格本質上可以加入內,因爲where子句排除不匹配,只是究竟有多糟的所有記錄用以下2查詢語句的語法風格第一:的TABLE1 T1,T2 TABLE2 WHERE T1.Blah = T2.Blah - VS - INNER JOIN

SELECT {COLUMN LIST} 
FROM TABLE1 t1, TABLE2 t2, TABLE3 t3, TABLE4 t4 (etc) 
WHERE t1.uid = t2.foreignid 
AND t2.uid = t3.foreignid 
AND t3.uid = t4.foreignid 
etc 

代替

SELECT {COLUMN LIST} 
FROM TABLE1 t1 
INNER JOIN TABLE2 t2 ON t1.uid = t2.foreignid 
INNER JOIN TABLE3 t3 ON t2.uid = t3.foreignid 
INNER JOIN TABLE4 t4 ON t3.uid = t4.foreignid 

我不知道這是否是有限的微軟SQL,甚至是特定的版本,但我理解是第一種情況是全外連接使所有可能的相關性都可以訪問。

我已經在過去使用第一種方法來優化訪問兩個顯著大數據的存儲,每個具有外圍表查詢加入他們,與那些產品加入後期走到一起查詢。通過允許每個「較大」表中的加入到它們各自的查找表,並且只結合每個較大的表中的一個特定子集,我發現有超過引入大表來之前彼此特定的過濾是顯着的速度提升。

在正常情況下(簡單連接)的情況下,使用第二種場景會不會更好?我發現它更容易閱讀,看起來會更快。

+0

我不會用來優化,有辦法做你所描述的使用派生表的例子或通過改變連接順序。 – HLGEM 2009-09-29 22:05:05

回答

2

也許回答這個最好的辦法就是看看在數據庫內部是怎樣處理的查詢。如果你使用的是SQL Server,可以使用Profiler來查看每個查詢需要多少次讀取以及查詢計劃來查看通過數據採取的路徑。統計數據,偏差等也很可能發揮作用。

2

第一個查詢不會產生一個完全外部連接(這是左,右加入的工會)。本質上,除非有[內部] SQL解析器特定的優化,否則兩個查詢都是相同的。

1

個人而言,我永遠不會使用第一種語法。它在性能上可能是相同的,但當事情變得複雜時,它更難以維持,並且更容易受到意外交叉連接的影響。如果你錯過了一個ON條件,它將會失敗語法檢查,如果你錯過了WHERE條件之一,就等於ON條件,它會很樂意做一個交叉連接。這也是一個句法,17年過時了,爲善!

此外,舊語法中的左和右連接語法在SQL Server中被破壞,並不總是返回正確的結果(它有時可能會將結果作爲corss連接而不是外連接)並且已被棄用在下一個版本中根本無法使用。如果您需要更改其中一個查詢以使用外連接,那麼您可以重寫一次重寫,因爲嘗試混合這兩種語法尤其糟糕。

相關問題