加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql – LEFT JOIN显着快于INNER JOIN

发布时间:2020-12-12 16:53:41 所属栏目:MsSql教程 来源:网络整理
导读:我有一张表(MainTable),有超过60万条记录.它通过父/子类型关系中的第二个表(JoinTable)连接到自己上: SELECT Child.ID,Parent.IDFROM MainTableAS ChildJOIN JoinTable ON Child.ID = JoinTable.IDJOIN MainTableAS Parent ON Parent.ID = JoinTable.ParentI
我有一张表(MainTable),有超过60万条记录.它通过父/子类型关系中的第二个表(JoinTable)连接到自己上:
SELECT   Child.ID,Parent.ID
FROM     MainTable
AS       Child
JOIN     JoinTable
      ON Child.ID = JoinTable.ID
JOIN     MainTable
AS       Parent
      ON Parent.ID = JoinTable.ParentID
     AND Parent.SomeOtherData = Child.SomeOtherData

我知道每个子记录都有父记录,并且JoinTable中的数据是acurate.

当我运行这个查询时,需要几分钟的时间才能运行.但是,如果我使用Left Join加入Parent,1秒运行:

SELECT   Child.ID,Parent.ID
FROM     MainTable
AS       Child
JOIN     JoinTable
      ON Child.ID = JoinTable.ID
LEFT JOIN MainTable
AS       Parent
      ON Parent.ID = JoinTable.ParentID
     AND Parent.SomeOtherData = Child.SomeOtherData
WHERE    ...[some info to make sure we don't select parent records in the child dataset]...

我了解INNER JOIN和LEFT JOIN之间的结果差异.在这种情况下,它返回完全相同的结果,因为每个孩子都有一个父项.如果我让两个查询运行,我可以比较数据集,它们是完全一样的.

为什么LEFT JOIN比INNER JOIN快得多?

UPDATE
检查查询计划以及使用内部连接时,将从父数据集开始.当执行左连接时,它将以子数据集开头.

它使用的索引都是一样的.

我可以强迫它总是从孩子开始吗?使用左连接工作,只是感觉错误.

以前曾经问过类似的问题,但似乎没有回答我的问题.

例如INNER JOIN vs LEFT JOIN performance in SQL Server中选择的答案说,左连接总是比内连接慢.这个论点是有道理的,但这不是我所看到的.

解决方法

左连接似乎更快,因为SQL被迫先做较小的选择,然后加入到这个较小的记录集中.由于某种原因,优化器不想自然而然.

3种方式强制联合以正确的顺序发生:

>将数据的第一个子集选择到临时表(或表变量)中,然后加入
>使用左连接(并记住这可能会返回不同的数据,因为它是一个左连接而不是内连接)
>使用FORCE ORDER关键字.请注意,如果表格大小或模式发生更改,则查询计划可能不正确(请参阅https://dba.stackexchange.com/questions/45388/forcing-join-order)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读