小编Jef*_*nCO的帖子

嵌套在 OUTER JOIN 中的 INNER JOIN 的语法与查询结果

TLDR;如果您查看 2 个执行计划,是否可以轻松回答哪个更好?我故意没有创建索引,所以更容易看到发生了什么。

继续我之前的问题,我们发现不同连接样式(即嵌套与传统)之间的查询性能差异,我意识到嵌套语法也会修改查询的行为。考虑以下 2 个查询。

SELECT  a.*, m.*, n.*
FROM    dbo.Autos a
LEFT JOIN dbo.Models m
  JOIN dbo.Manufacturers n  -- <-- Nested INNER JOIN
  ON n.ManufacturerID = m.ManufacturerID
ON m.ModelID = a.ModelID
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

这并不一定使制造商加入,以包括与ModelID自动行是不是在型号表。

在此处输入图片说明

使用传统语法,我们必须将 Manufactures 的连接更改为外部连接,就像这样……但这会改变查询计划。

SELECT a.*, m.*, n.*
FROM dbo.Autos a
LEFT JOIN dbo.Models m
ON m.ModelID = a.ModelID
LEFT JOIN dbo.Manufacturers n -- <-- Now LEFT OUTER JOIN
ON n.ManufacturerID = m.ManufacturerID
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

join sql-server syntax sql-server-2012

11
推荐指数
1
解决办法
4万
查看次数

连接语法/样式性能考虑

我们最近在我们的一个存储过程中发现,通过从这里更改查询的连接语法/样式,我们获得了显着的性能改进......

SELECT b.bla, c.foo, d.bar
FROM dbo.TableB b
JOIN dbo.TableC c
    JOIN dbo.TableD d  -- <-- Nested join syntax
    ON d.yyy = c.yyy
ON c.xxx = b.xxx
Run Code Online (Sandbox Code Playgroud)

对此...

SELECT b.bla, c.foo, d.bar
FROM dbo.TableB b
JOIN dbo.TableC c
ON c.xxx = b.xxx
JOIN dbo.TableD d   -- <-- Regular way
ON d.yyy = c.yyy
Run Code Online (Sandbox Code Playgroud)

注意:在实际查询中,有 10 个连接表,包括内连接和外连接。就sql数据而言,这些表并不大。没有聚合。输出中有一个 DISTINCT。所有连接都指向一个主键,但外键不一定被索引。

我们肯定会改变我们的方式,但我仍然很好奇关于这种风格的正确“指导”。我经常使用“缩进”样式来表示诸如查找表之类的“更具可读性”的连接。

sql-server sql-server-2012

5
推荐指数
1
解决办法
555
查看次数

标签 统计

sql-server ×2

sql-server-2012 ×2

join ×1

syntax ×1