SQL内部与左连接问题
我有一个非常糟糕的sql查询。我跟踪到了表上执行的内部联接。将此连接更改为左连接可显著提高性能(从6分钟提高到20秒)-现在我知道2不相等,但。。。这就是我要问的SQL内部与左连接问题,sql,sql-server,performance,sql-server-2005,tsql,Sql,Sql Server,Performance,Sql Server 2005,Tsql,我有一个非常糟糕的sql查询。我跟踪到了表上执行的内部联接。将此连接更改为左连接可显著提高性能(从6分钟提高到20秒)-现在我知道2不相等,但。。。这就是我要问的 SELECT * FROM SomeTable ST JOIN BigTable BT ON BT.SomeID = ST.SomeID AND BT.Something = ST.Something AND BT.AnotherValue = '1
SELECT *
FROM SomeTable ST
JOIN BigTable BT ON BT.SomeID = ST.SomeID
AND BT.Something = ST.Something
AND BT.AnotherValue = '123'
因为连接有额外的条件(并且something=something)——将此连接更改为左连接是否会产生相同的结果——但速度要快得多
使用LEFT/INNER返回的结果相同,但LEFT的速度明显更快 看起来,以另一种方式进行内部连接会提供更好的性能
SELECT
*
FROM
BigTable AS BT
INNER JOIN
SomeTable AS ST
ON
BT.AnotherValue = '123'
AND
BT.SomeID = ST.SomeID
AND
BT.Something = ST.Something
或者使用子查询
SELECT
*
FROM
(SELECT * FROM BigTable WHERE AnotherValue = '123') AS BT
INNER JOIN
SomeTable AS ST
AND
BT.SomeID = ST.SomeID
AND
BT.Something = ST.Something
另外,请确保已正确索引
BigTable.AnotherValue
。当您从两个联接中获得相同的结果时,重要的是要理解左联接不同于内部联接
左连接将从中获取所有行
左表即使没有
右表中的匹配项
vs
因此,在给定两个不同的联接时,数据恰好以相同的方式生成
SELECT *
FROM SomeTable ST
JOIN BigTable BT ON BT.SomeID = ST.SomeID
AND BT.Something = ST.Something
AND BT.AnotherValue = '123'
这个怎么样:
SELECT
*
FROM
SomeTable
INNER JOIN
BigTable
ON SomeTable.PreferedPrimaryKey = BigTable.PreferAForeignKey
AND SomeTable.SomethingThatIsIndexedAndPreferableNumeric = BigTable.SomethingThatIsIndexedAndPreferableNumeric
WHERE
BigTable.AnotherValue = '123'
检查索引,确保联接第二部分的条件不是非索引字符串。这很奇怪,因为在大多数情况下,
内部联接的性能更好。外部联接
即使在不匹配的地方也必须返回行。你确定没有比连接类型更重要的了吗?是的,我和以前一样困惑-逻辑读取下降了数百万(数百万)您能为这两个项目发布执行计划吗?您是否检查了执行计划以查看幕后是否还有其他事情发生?向我们展示:执行计划+表上的索引。您不使用W3S作为可信源。从未。这是他们告诉我的。我不知道你是从哪里听说w3schools的,但是sql连接已经存在了几十年,并在多个数据库中实现。他们可能是对的。内部连接
与左连接
不同,但它们并不总是给出不同的结果。如果左边桌子的每一行在右边桌子上都有一个匹配项,那么它们是等价的。我同意,这就是我所说的。