Sql server 2008 生成笛卡尔积的两个表之间的联接
我正在读一本书“Inside Microsoft SQL Server 2008:T-SQL Querying*”,书中举了一个例子,说明在两个表之间进行任何连接时,首先笛卡尔乘积发生在它们之间,然后使用ON条件进行过滤,然后按“RIGHT”、“LEFT”或“FULL”连接类型进行过滤 从那本书的一个例子来看Sql server 2008 生成笛卡尔积的两个表之间的联接,sql-server-2008,tsql,join,cartesian-product,Sql Server 2008,Tsql,Join,Cartesian Product,我正在读一本书“Inside Microsoft SQL Server 2008:T-SQL Querying*”,书中举了一个例子,说明在两个表之间进行任何连接时,首先笛卡尔乘积发生在它们之间,然后使用ON条件进行过滤,然后按“RIGHT”、“LEFT”或“FULL”连接类型进行过滤 从那本书的一个例子来看 SELECT C.customerid, COUNT(O.orderid) AS numorders FROM dbo.Customers AS C LEFT OUTER JOIN dbo
SELECT C.customerid, COUNT(O.orderid) AS numorders
FROM dbo.Customers AS C
LEFT OUTER JOIN dbo.Orders AS O
ON C.customerid = O.customerid
Customer表有4行,Orders表有7行。所以,首先笛卡尔乘积将生成4*7=28行,然后它将通过“ON”子句进行筛选,并将其保留在外部
这是否意味着无论我使用哪种类型的联接,每次表之间都会发生笛卡尔积?那么为什么我们会看到不同联接之间的性能差异
两个表之间的任何连接首先笛卡尔积发生在它们之间,然后使用ON条件过滤,然后使用“RIGHT”、“LEFT”或“FULL”连接类型过滤
只是对所做操作的逻辑描述。结果将与此相同,但根据您拥有的索引和表中的数据不同,其实现方式也不同
请参见在上设置showplan,然后执行查询,它将解释如何查找数据。希望这本书会在您深入了解时对此进行解释。SQL Server当然不会计算每个联接的笛卡尔积,然后对其进行过滤,它所做的是将您的SQL语句与左、右、内……一起使用如果指定了连接类型,那么优化器将根据表中的统计信息决定使用哪个物理连接运算符 有3个物理操作员:
- 嵌套循环连接
- 合并联接
- 散列联接
我建议看一下该列表中最下面的5篇文章,其中包括连接介绍、连接属性摘要,然后是关于每个物理连接运算符的合理深入信息。说笛卡尔乘积发生并被过滤是非常误导的。如果是这样的话,那么实际上就是我不可能连接200万行表,因为首先,您将从一个万亿行结果集开始,然后对其进行筛选。没有多少SQL Server实现可以处理这个结果集
因此,不,对于编写良好的查询,笛卡尔乘积并不是过程的第一步。对于编写糟糕的查询,所有赌注都没有。有可能迫使SQL Server做出选择,但这几乎毫无疑问是程序员错误的一个简单例子。很抱歉我的英语不好。可能是因为我无法理解那本书内容清晰,请尝试交叉连接statement@Aycan我不明白你的意思。我的问题的目的是了解t-sql在内部是如何工作的。@AycanYaşı我相信OP想知道一个左连接是否真的可以被看作是一个交叉连接,然后被过滤掉,或者它是sql Server内部实际发生的事情。对不起,我知道了那我就不明白这个问题了。我这么做了。通过阅读,我认为这是一个表格格式的执行计划。如果我错了,请纠正我。我认为这是正确的,但我认为你要做的主要事情是在书中多学习,然后在你学到更多信息后再看这个问题。这确实是正确的选择:)。不过,我会继续恩,这是一个选项,看看我们是否能得到更多的回应。无论如何,我会在我读这本书的过程中与大家分享我的发现。+1我可以看到这本书有更详细的信息,我期待着精彩的帖子和精彩的ans——这正是我所需要的。