2016-12-27 82 views
6

我在試着看看我對JOINs的理解是否正確。在表JOIN中實際發生了什麼?

對於以下查詢:

SELECT * FROM tableA 
    join tableB on tableA.someId = tableB.someId 
    join tableC on tableA.someId = tableC.someId; 

是否RDMS如下基本執行類似的僞代碼:

List tempResults 
for each A_record in tableA 
    for each B_record in tableB 
     if (A_record.someId = B_record.someId) 
      tempResults.add(A_record) 

List results 
for each Temp_Record in tempResults 
    for each C_record in tableC 
     if (Temp_record.someId = C_record.someId) 
      results.add(C_record) 

return results; 

所以基本上更多的記錄與同someIdtableAtableBtableC中, RDMS有更多的記錄掃描?如果所有3個表的記錄都是相同的someId,那麼基本上在所有3個表上完成全表掃描?

我的理解是否正確?

+0

不錯的問題。但我不確定是否有人能回答這個問題。 ';''當然,我覺得背後也有同樣的事情發生。 –

+0

想更瞭解T-SQL連接語句嗎?這[加入](https://mva.microsoft.com/en-US/training-courses/querying-with-transactsql-10530?l=BooD4g87_7904984382)是理解它們的好幫手。 – Edward

+0

[**此帖**](http://stackoverflow.com/questions/29795400/loop-join-in-sql-server-2008)ii有用。 – Vikrant

回答

4

每個供應商的查詢處理器當然都是以不同的方式編寫(編碼)的,但它們可能共享許多常用技術。實現一個連接可以以多種方式完成,並且在任何供應商的實現中選擇哪一個將取決於具體情況,但是將考慮的因素包括數據是否已經由連接屬性排序,每個表中記錄的相對數量(一組數據中的20條記錄與另一組數據中的百萬條記錄之間的連接將以不同於每組記錄具有相當大小的記錄的連接)進行。我不知道MySQL的內部結構,但對於SQL服務器,有三種不同的連接技術,一個是合併連接,一個循環連接,和一個散列連接。看看this

+0

那麼我提供的僞代碼是*** Loop Join ***的一個例子嗎? – Glide

+0

是的,你做的是循環連接。如果一個小集合與一個非常大的集合連接,這種方法是適當的。當然,你可以遍歷小數據,並且每條記錄都使用索引來查找大數據中的匹配。 –

相關問題