Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 生成笛卡尔积的两个表之间的联接_Sql Server 2008_Tsql_Join_Cartesian Product - Fatal编程技术网

Sql server 2008 生成笛卡尔积的两个表之间的联接

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

我正在读一本书“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.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个物理操作员:

  • 嵌套循环连接
  • 合并联接
  • 散列联接
所有这三个表都有自己的理想场景,在那里它们得到了最好的使用(我不在这里解释它们,每个表上都有大量的文章),这主要取决于联接中涉及的每个表的基数估计以及优化器希望返回多少行的统计信息,即使用哪一行

Craig Freedman发表了一系列关于连接在SQL server中如何工作的博文,如下所示:


我建议看一下该列表中最下面的5篇文章,其中包括连接介绍、连接属性摘要,然后是关于每个物理连接运算符的合理深入信息。

说笛卡尔乘积发生并被过滤是非常误导的。如果是这样的话,那么实际上就是我不可能连接200万行表,因为首先,您将从一个万亿行结果集开始,然后对其进行筛选。没有多少SQL Server实现可以处理这个结果集


因此,不,对于编写良好的查询,笛卡尔乘积并不是过程的第一步。对于编写糟糕的查询,所有赌注都没有。有可能迫使SQL Server做出选择,但这几乎毫无疑问是程序员错误的一个简单例子。

很抱歉我的英语不好。可能是因为我无法理解那本书内容清晰,请尝试交叉连接statement@Aycan我不明白你的意思。我的问题的目的是了解t-sql在内部是如何工作的。@AycanYaşı我相信OP想知道一个左连接是否真的可以被看作是一个交叉连接,然后被过滤掉,或者它是sql Server内部实际发生的事情。对不起,我知道了那我就不明白这个问题了。我这么做了。通过阅读,我认为这是一个表格格式的执行计划。如果我错了,请纠正我。我认为这是正确的,但我认为你要做的主要事情是在书中多学习,然后在你学到更多信息后再看这个问题。这确实是正确的选择:)。不过,我会继续恩,这是一个选项,看看我们是否能得到更多的回应。无论如何,我会在我读这本书的过程中与大家分享我的发现。+1我可以看到这本书有更详细的信息,我期待着精彩的帖子和精彩的ans——这正是我所需要的。