2016-12-27 33 views
6

Próbuję sprawdzić, czy moje zrozumienie JOINs jest poprawne.Co tak naprawdę dzieje się podczas łączenia tabel?

Dla następującego zapytania:

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

Czy RDMS zasadzie wykonać podobną Pseudokod następująco:

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; 

więc w zasadzie im więcej rekordów z tym samym someIdtableA ma z tableB i tableC, w więcej rekordów, które RDMS ma skan? Jeśli wszystkie 3 tabele mają zapisy z tym samym someId, to w zasadzie pełne skanowanie tabeli odbywa się na wszystkich 3 stołach?

Czy moje zrozumienie jest prawidłowe?

+0

Ładne pytanie. Ale nie jestem pewien, czy ktoś może odpowiedzieć na to pytanie. ';)' Zdecydowanie czuję, że to samo dzieje się z tyłu. –

+0

Chcesz zrozumieć instrukcje łączenia T-SQL więcej? To [join] (https://mva.microsoft.com/en-US/training-courses/querying-with-transactsql-10530?l=BooD4g87_7904984382) jest dobrym elementem do ich zrozumienia. – Edward

+0

[** Ten post **] (http://stackoverflow.com/questions/29795400/loop-join-in-sql-server-2008) ii użyteczne. – Vikrant

Odpowiedz

4

Procesor zapytań każdego dostawcy jest oczywiście napisany (kodowany) nieco inaczej, ale prawdopodobnie ma wiele wspólnych technik. Implementacja łączenia może odbywać się na różne sposoby, a która z nich zostanie wybrana, w jakiejkolwiek implementacji dostawcy, będzie zależna od konkretnej sytuacji, ale rozważane czynniki obejmują to, czy dane są już posortowane według atrybutu łączenia, względna liczba rekordów w każdej tabeli (połączenie 20 rekordów w jednym zestawie danych z milionem rekordów w drugim będzie odbywać się inaczej niż w przypadku, gdy każdy zestaw rekordów ma porównywalną wielkość). Nie znam elementów wewnętrznych dla MySQL, ale dla serwera SQL istnieją trzy różne techniki łączenia, Połączenie Połącz, Połączenie pętli i Hash Połączenie. Spójrz na this.

+0

Czy podany tu pseudokod jest przykładem *** Loop Join ***? – Glide

+0

Tak, to co zrobiłeś, to dołączenie do pętli. Takie podejście jest odpowiednie, jeśli mały zestaw ma zostać połączony z bardzo dużym zestawem. Wykonujesz iterację po małym, i dla każdego rekordu używasz indeksu, aby znaleźć dopasowania w dużym. –