2016-12-27 83 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

是的,你做的是循环连接。如果一个小集合与一个非常大的集合连接,这种方法是适当的。当然,你可以遍历小数据,并且每条记录都使用索引来查找大数据中的匹配。 –

相关问题