我有一张桌子(MainTable
)有超过 600,000 条记录。它通过第二个表连接到自身(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中的数据是准确的。
当我运行这个查询时,它实际上需要几分钟的时间才能运行。但是,如果我使用 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
and a LEFT JOIN
。在这种情况下,它返回的结果与每个孩子都有父母完全相同。如果我让两个查询都运行,我可以比较数据集,它们是完全相同的。
为什么这是一个LEFT JOIN
运行速度比INNER JOIN
?
更新
检查查询计划,当使用内部联接时,它从父数据集开始。进行左连接时,它从子数据集开始。
它使用的索引都是相同的。
我可以强制它总是从孩子开始吗?使用左连接是可行的,只是感觉不对。
类似的问题以前曾在这里被问过,但似乎没有人回答我的问题。
例如中选定的答案SQL Server 中的 INNER JOIN 与 LEFT JOIN 性能 https://stackoverflow.com/questions/2726657/inner-join-vs-left-join-performance-in-sql-server说左连接总是比内连接慢。这个说法有道理,但不是我所看到的。