3 sql t-sql sql-server sql-server-2008
两个查询之间有什么区别?
SELECT CountryMaster.Id
FROM Districts INNER JOIN
CountryMaster ON Districts.CountryId = CountryMaster.Id
SELECT CountryMaster.Id
FROM CountryMaster INNER JOIN
Districts ON Districts.CountryId = CountryMaster.Id
Run Code Online (Sandbox Code Playgroud)
我知道输出将是相同的,但我想要知道,如果我忽略复杂查询中的表和列的位置或具有数十万行数据的表格,那么是否存在相同的剧烈效果.
没有任何区别.连接的顺序无关紧要.数据库引擎内的查询优化器将决定合并计划,以根据这些表中数据的存储统计信息实际处理来自两个表的记录.
实际上,在许多情况下,查询优化器将为使用连接的查询生成与用相关子查询表达的查询完全相同的计划.
我所学到的教训是:
始终以最清楚地表示您尝试创建的流程的含义的语法或表示开始,并信任查询优化器来完成其工作.话虽如此,查询优化器并不完美,所以如果存在性能问题,请使用查询show plan with alternate constructions,看看它是否有所改进......
关于内部连接和外部连接的性能的一个快速评论.内连接本质上比外连接更快是不正确的.相对性能完全取决于查询引擎使用三种类型的处理连接中的哪一种;
1.嵌套循环加入,2.,合并加入,或3.散列加入.
例如,当连接一侧的记录集远小于另一侧的记录集时,使用嵌套循环连接,并且在连接列[s]上索引较大的集合.在这种情况下,如果较小的集合是"外部"侧,则外部连接将更快.原因是嵌套循环连接从该较小的集合中获取整个记录集,并遍历每个记录,从匹配的较大集合中查找记录.当较大的集合中没有找到匹配时,内部联接必须执行从较小的一侧移除行的第二步.外连接不会执行此第二步.
三种可能类型的连接过程中的每一种都有自己的特征行为模式...有关 详细信息,请参阅 嵌套循环连接, 合并连接和散列连接.