Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.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 是不是;加入;顺序将导致不同的查询性能_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 是不是;加入;顺序将导致不同的查询性能

Sql 是不是;加入;顺序将导致不同的查询性能,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有两张桌子(表1表2),表2比表1大 脚本1: 脚本2: 性能脚本#1是否比脚本#2更好?您使用的是内部联接,因此答案是否 由于联接类型的不同,这将产生完全相同的数据量,并且您在两个查询中通过相同的关系联接,因此它们基本相同 如果使用了左联接,则情况会有所不同,因为在左联接中,主(左)表中的所有数据都会保留,而详细信息表(右)中的所有匹配数据都会保留 因此,如果您使用left join,并将较大的表放在左侧,那么查询将产生更多的数据,并且可能会比将较大的表放在右侧慢。它应该创建相同的计划。但是

我有两张桌子(表1表2),表2比表1大

脚本1:

脚本2:


性能脚本#1是否比脚本#2更好?

您使用的是内部联接,因此答案是

由于联接类型的不同,这将产生完全相同的数据量,并且您在两个查询中通过相同的关系联接,因此它们基本相同

如果使用了左联接,则情况会有所不同,因为在左联接中,主(左)表中的所有数据都会保留,而详细信息表(右)中的所有匹配数据都会保留

因此,如果您使用left join,并将较大的表放在左侧,那么查询将产生更多的数据,并且可能会比将较大的表放在右侧慢。

它应该创建相同的计划。但是,如果有很多连接,由于处理这些连接的可能方法有很多,因此更改连接顺序可能会改变计划


当然,这仅适用于内部联接,外部联接可能会返回不同的结果。BTW,优化器应该喜欢外部连接,这大大减少了可能的连接顺序的数量:-)/P>< P>内部连接是交换的,这意味着连接B= B连接。逻辑连接可以是内部连接,但是在执行计划SQL中,可以尝试考虑嵌套循环、基于多个参数的散列或合并。物理连接没有一个是坏的,各有所长


您可以从自己的角度(至少)注意的一件事是,尝试查看两个联接列是否都已编制索引,是否存在sargabilty,是否没有隐式转换。

SQL Server
基于成本生成执行计划。。。所以答案是否定的。内部连接是完全可交换的,只要你没有强制连接顺序的提示,乐观主义者就会按照它认为合适的方式重新排列它们。我不理解这个问题的投票结果。这是一个很容易自己做的测试,我甚至考虑过投反对票。@Zoharpled,很容易就可以找到很多答案。这一个有很多重复:
SELECT t1.A, t2.B
FROM table1 AS t1
JOIN table2 AS t2 ON t1.PK = t2.FK
SELECT t1.A, t2.B
FROM table2 AS t2
JOIN table1 AS t1 ON t1.PK = t2.FK