2011-11-25 134 views
1

我有兩個表。一個是小桌子,另一個是大桌子。這時兩個表之間的連接,這表我會繼續在左邊和一個右,以便查詢優化器將搜索更快也不要緊,我會加入表..Sql Server加入查詢

例如:

--1 
SELECT smalltable.column1, 
     largetable.column1 
    FROM smalltable 
INNER JOIN largetable 
    ON smalltable.column1 = largetable.column1 ; 
--2 
SELECT smalltable.column1, 
     largetable.column1 
    FROM smalltable 
INNER JOIN largetable 
    ON largetable.column1 = smalltable.column1 ; 

哪個查詢會使其更快或無關緊要。

+0

你使用什麼服務器? –

+0

這取決於...什麼是你的表格結構和你需要的輸出是什麼? –

+0

我正在使用sql server 2008 –

回答

1

對於最體面的SQL Server變體的查詢優化器將解決這個問題。一些有價值的人不會(有一個查詢優化器 - 舊的MySQL,Access在我看來)。 SOme可能會被複雜的決策覆蓋(這很簡單)。

但總的來說 - 先信任查詢優化器。

2

如果您在談論Microsoft SQL Server,那麼這兩個查詢都等同於查詢優化器。事實上,對於幾乎任何基於成本的查詢優化器,它們都是等價的。您可以通過查看執行計劃來嘗試(詳情請參閱http://www.simple-talk.com/sql/performance/execution-plan-basics/)。

+0

你的答案直接與@lloydom的答案相矛盾。謹慎評論? – onedaywhen

+0

這更多的是一場哲學辯論,但我傾向於說「儘可能地傾注於優化器」。其原因是雙重的:首先,未來完成的任何優化都是爲了「免費」提升性能。其次,在基於成本的優化器中,如果數據庫管理系統必須完成統計數據的計算工作,那麼這種或那種實際決策並不是很「有效」,它已經不得不疏通數據。現在你可以很容易地反駁你什麼時候沒有足夠的統計數據,但我認爲這應該在其他地方解決。這只是一個偏好問題。 –

1

應該使用哪個順序並不重要,因爲您的SQL Server應該爲您優化查詢執行。但是,(如果您使用的是Microsoft SQL Server),則可以使用SQL Server Profiler(位於SQL Server Management Studio的「工具」菜單下)來檢查這兩個選項的執行計劃。

0

如果其中一個表小於另一個表。 先放置較小的表格,然後放置較大的表格,因爲它的工作量較少,而且這將有助於查詢優化器選擇使用散列連接的計劃。 然後運行查詢分析器並檢查是否使用了哈希連接,因爲這是此場景中最好和最快的。 如果連接表上沒有索引,那麼優化器將選擇散列連接。 可以在內部聯接語句後使用OPTION(HASH JOIN)強制進行哈希聯接

從MSDN,http://blogs.msdn.com/b/irenak/archive/2006/03/24/559855.aspx

連接表的列名被稱爲散列鍵。在上面的例子中,它將是au_id。 SQL Server檢查正在連接的兩個表,選擇較小的表(稱爲構建輸入),並構建將散列算法應用於散列鍵值的散列表。根據爲散列鍵計算的散列值將每行插入散列桶中。如果構建輸入完全在內存中完成,則散列連接被稱爲「內存散列連接」。如果SQL Server沒有足夠的內存來保存整個構建輸入,則該過程將以塊爲單位完成,並稱爲「寬限散列連接」。

+0

你的回答直接與@Stefan Mai的答案相矛盾。謹慎評論? – onedaywhen

+0

最好在可以的時候幫助優化器,把所有東西都留給它不是一個好主意,因爲計算機資源是有限的,例如,如果你正在做4到6個表連接,優化器需要更長時間才能找到最好自己計劃,然後運行查詢,然後在一定時間內採取措施並使用舊計劃。 – lloydom

0

在運行這兩個查詢之前,請從菜單&中選擇「包括實際執行計劃」,然後運行查詢。 Sql服務器將顯示執行計劃,這是創建優化查詢的最佳工具。請參閱m ore about Execution Plan here

0

連接列的順序很重要。有關更多詳細信息,請參閱this post。在這個線程中也沒有關於索引的討論。它是最佳連接表順序AND useful indexing的組合,可實現最快的執行查詢。