3

这两个查询有什么区别?

   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  

我知道输出将是相同的,但我想知道如果我忽略复杂查询中的表和列的位置或具有大量数据(如数十万行)的表的位置,是否会产生相同的严重影响。

4

2 回答 2

8

没有任何区别。连接的顺序无关紧要。数据库引擎内的查询优化器将根据这些表中数据的存储统计信息来决定合并计划以实际处理来自这两个表的记录。
事实上,在许多情况下,查询优化器将为使用连接短语的查询生成与使用相关子查询短语的查询完全相同的计划。
我在这里学到的教训是:

始终从最清楚地代表您尝试创建的过程的含义的语法或表示开始,并信任查询优化器来完成它的工作。话虽如此,查询优化器并不完美,所以如果出现性能问题,请使用带有替代结构的查询显示计划,看看它是否有所改善......

关于内部与外部联接性能的快速评论。内连接本质上比外连接快是不正确的。相对性能完全取决于查询引擎使用三种处理连接中的哪一种;
1. 嵌套循环连接,2.,合并连接,或 3. 哈希连接。
例如,当连接一侧的记录集比另一侧的记录集小很多时,使用嵌套循环连接,并且较大的集在连接列[s] 上被索引。在这种情况下,如果较小的集合是“外”端,那么外连接会更快。原因是嵌套循环连接从较小的集合中获取整个记录集,并遍历每个记录,从较大的集合中找到匹配的记录。当在较大的集合中没有找到匹配时,内部连接必须执行第二步,从较小的一侧删除行。外连接不执行此第二步。

三种可能的连接过程类型中的每一种都有自己的特征行为模式...有关详细信息,请参阅 嵌套循环连接合并连接哈希连接

于 2012-10-08T15:34:23.110 回答
1

正如所写,它们是相同的。查尔斯的出色回答。

如果您想知道它们是否会有不同的执行计划,那么只需在 SSMS 中显示执行计划。

至于速度,将连接中使用的列编入索引。
维护索引 - 碎片索引几乎没有那么有效。
查询计划并不总是相同的。
查询优化器保留统计信息,并且随着数据配置文件的更改,最佳计划可能会更改。
几千行不是很多。
一旦达到数百万,然后调整索引和语法(带有提示)。
有时您必须投入数百万美元才能获得足够的数据进行调整。

还有一个等效的 UNION 运算符,有时速度更快。

连接提示 Loop 不是对称的,因此在这种情况下,以下查询计划是不同的,但它们仍然是相同的结果。

如果一个是 PK 表,我总是把它放在第一位。
在这种情况下,第一个速度是第二个的两倍。

select top 10 docSVsys.sID, docMVtext.fieldID
from docSVsys 
inner loop join docMVtext 
   on docMVtext.sID = docSVsys.sID
where docSVsys.sID < 100
order by docSVsys.sID, docMVtext.fieldID

select top 10 docSVsys.sID, docMVtext.fieldID
from docMVtext
inner loop join docSVsys 
   on docMVtext.sID = docSVsys.sID
where docSVsys.sID < 100
order by docSVsys.sID, docMVtext.fieldID

高级查询调优概念

于 2012-10-08T19:35:08.347 回答