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