2011-08-15 33 views
-1

我提前对长问题表示歉意。大多数在线文章没有涉及这一点,他们只是展示了一个快速的结果集。对于这样一个重要和常用的想法,我想完全理解这一点。我在这里看到了很多关于具体例子的帖子,但是没有一个在我的脑海中有了核心思想。我的问题是,当你做3+表连接时,这是如何在内存中工作的?目前我使用的语句是:从根本上理解3个或更多的表sql连接

打完
select a.cust_id, a.[first name],a.[last name],a.[primary zip],c.jerseynum 
from contact as a 
join notes as b 
on a.cust_id = b.cust_id 
join jerseytable as c 
on a.cust_id = c.cust_id 

a和b,我们得到的结果集的第一次加盟,我们把它叫做1 我然后做一个对a和c加入...这对我来说很模糊。这个结果集不仅仅取代了我以前的连接,它只是将记录添加到1,只适合a和c之间的连接?

+0

如果你想了解这个主题,请阅读维基百科有关基本关系代数和谷歌的文章以进行查询优化。 http://en.wikipedia.org/wiki/Relational_algebra – Matten

+2

如果你想知道事情如何在内存中工作,**请说明哪些数据库** - MySQL,SQL Server,Oracle? – JNK

+1

我认为这是NARQ,因为他要求内部并没有/不会指定数据库实现。 – JNK

回答

1

a与b连接,则结果集与c连接。 (如果您使用MS SQL Server,可以在查询执行计划中看到此过程)。

3

你基本上是问数据库如何执行查询。这方面有很多理论和实践,不止一个答案可以给你。

查询引擎有很多工具可供使用,具体取决于连接,索引和其他保留的统计数据。它可以构建内存表,重新排序连接(在某些情况下)以更好地限制返回的行数。它可以识别不同连接的结果并将它们合并在一起。

阅读关于查询计划的入门:http://en.wikipedia.org/wiki/Query_plan以及查询优化的相关部分。

+0

我在问我写什么,你有第一次加入表a和b。这给你一个表,我们会说表1.如果我然后加入表a和c,它是否比较我的表1已经在内存中,或者它只是使另一个表a和c。这就是我困惑的地方,我希望有人能够一步一步地过去。总体来说,当你做多个连接时,你最终会得到一张表,而我不知道如何。 –

+0

我说的是 - 它可能不会先比较表a和b。它可能首先执行a和c,它可以分别执行a和c以及a和b,然后将它们合并。这个问题没有单一的答案,因为数据库解释查询并提供结果的操作和计算非常复杂,在我提供的链接中有所详述。 – Joe

1

解析完查询后,数据库引擎将生成一个计划,该计划描述了为获取查询结果而采取的实际步骤。你应该检查你的实际计划,以了解真正发生的事情。 基本上,无论您在sql中编写的顺序如何,优化器都会选择连接的顺序。连接的实际顺序将取决于索引和数据上保存的统计数据。 在查询优化器上看到这篇文章http://research.microsoft.com/pubs/76059/pods98-tutorial.pdf

+0

@JNK,我的答案与MS SQL Server完全没有任何关系。此外,我链接的文章是完全一般的和科学的,与MS SQL Server没有任何关系,因此它与microsoft.com上的托管相关。所以,一切都很好。 – bpgergo

+0

你是对的,道歉。 – JNK

3

JOIN是一个关系运算符:它需要两个关系作为参数,结果是另一个关系。

关系运算符可以串在一起。考虑你的查询写在关系语言教程d:

假设xy适当声明的关系变量(relvars):

x := a MATCHING b; 
y := x JOIN c {jerseynum}; 

或者:

y := a JOIN c {jerseynum}; 
x := y MATCHING b; 

然而,上述力量的优化程序的执行顺序:将中间结果分配给relvars基本上告诉优化程序如何完成它的工作(即不好)。它们可以串在一起,例如如下:

a MATCHING b JOIN c {jerseynum}; 

的SQL FROM子句的工作以类似的方式,即没有必要分配给中间体(衍生)的表。优化器可以按照它认为合适的顺序自由评估它们。相信优化器:)