首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >左连接比内连接快得多

左连接比内连接快得多
EN

Stack Overflow用户
提问于 2013-06-14 11:52:35
回答 1查看 34.3K关注 1票数 25

我有一个表(MainTable),其中有超过600,000条记录。它通过父/子类型关系中的第二个表(JoinTable)连接到自己:

代码语言:javascript
运行
复制
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中的数据是精确的。

当我运行这个查询时,它确实需要几分钟才能运行。但是,如果我使用Left join连接到父节点,则运行时间不到1秒:

代码语言:javascript
运行
复制
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 JOINLEFT JOIN在结果上的区别。在这种情况下,它返回的结果完全相同,因为每个子级都有一个父级。如果我让这两个查询运行,我可以比较数据集,它们是完全相同的。

为什么LEFT JOININNER JOIN快这么多?

UPDATE检查了查询计划,当使用内部联接时,它从父数据集开始。当执行左连接时,它从子数据集开始。

它使用的索引都是相同的。

我可以强制它总是从孩子开始吗?使用左连接是可行的,只是感觉不对劲。

这里以前也问过类似的问题,但似乎没有人回答我的问题。

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

EN

回答 1

Stack Overflow用户

发布于 2013-06-14 12:29:49

试试这个吧。同样的结果,不同的方法:

代码语言:javascript
运行
复制
SELECT c.ID, p.ID 
FROM
(SELECT   Child.ID, JoinTable.ParentID
FROM     MainTable
AS       Child
JOIN     JoinTable
      ON Child.ID = JoinTable.ID) AS c
INNER JOIN 
(SELECT   Parent.ID, JoinTable.ID
FROM     MainTable
AS       Parent
JOIN     JoinTable
      ON Parent.ID = JoinTable.ParentID
     AND Parent.SomeOtherData = Child.SomeOtherData) AS p
ON c.ParentID = p.ID

如果没有帮助,可以使用cte:

代码语言:javascript
运行
复制
;WITH cte AS
(SELECT   Child.ID, JoinTable.ParentID
FROM     MainTable
AS       Child
JOIN     JoinTable
      ON Child.ID = JoinTable.ID)
SELECT cte.ID, Parent.ID
FROM cte INNER JOIN 
MainTable
AS       Parent
      ON Parent.ID = cte.ParentID
     AND Parent.SomeOtherData = cte.SomeOtherData
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17100819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档