这些之间有什么区别?(涉及IT技术)

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  

我知道输出结果会一样,但是如果我忽略复杂查询或拥有数十万行数据(如成百上千个行),表格和列的位置是否会有任何剧烈影响?

2个回答

8
没有任何区别。连接的顺序是无关紧要的。数据库引擎内部的查询优化器将根据这些表中存储的数据统计信息决定合并计划,以实际处理来自两个表的记录。
实际上,在许多情况下,查询优化器将为使用联接语句的查询和使用相关子查询的查询生成完全相同的计划。
我从中学到的教训是:
始终从最清晰地表示您正在创建的过程含义的语法或表示开始,并信任查询优化器执行其工作。话虽如此,查询优化器并不完美,因此如果存在性能问题,请使用查询显示计划与替代构造,并查看是否会改善...

关于内连接和外连接的性能,有一点需要说明。内连接并不比外连接更快。相对性能完全取决于查询引擎使用的三种连接处理类型:
1. 嵌套循环连接(Nested Loop Join);2. 合并连接(Merge Join);或者3. 哈希连接(Hash Join)。
例如,当连接一侧的记录集比另一侧小得多,并且较大的集合在连接列上建立了索引时,就会使用嵌套循环连接。在这种情况下,如果较小的集合是“外部”侧,则外连接将更快。原因是嵌套循环连接需要从较小的集合中获取整个记录集,并遍历每个记录,找到与较大集合匹配的记录。而内连接则需要执行第二步操作,从较小的一侧删除未在较大集合中找到匹配项的行。而外连接不执行此第二步操作。

每种可能的连接过程都有其独特的行为模式...详情请参见嵌套循环连接(Nested Loop Joins)合并连接(Merge Joins)哈希连接(Hash Joins)

我不知道这一点。我总是从预期返回最少潜在结果的查询开始。 - Paul Alan Taylor

1

按照所写的,它们是相同的。Charles 的回答非常好。

如果您想知道它们是否会有不同的执行计划,那么只需在 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

高级查询调优概念


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接