我有一个非常糟糕的SQL查询。我将其追踪到桌面上执行的INNER JOIN。将此更改为LEFT join可显着提高性能(从6分钟到20秒) - 现在我知道2不等同,但......这就是我要问的问题
SELECT *
FROM SomeTable ST
JOIN BigTable BT ON BT.SomeID = ST.SomeID
AND BT.Something = ST.Something
AND BT.AnotherValue = '123'
由于连接有其他标准(并且有些东西) - 将此更改为左连接会产生相同的结果 - 但更快?
使用LEFT / INNER返回的结果是相同的,左边明显更快......
答案 0 :(得分:2)
看起来反过来做内连接可以提供更好的性能......
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
已正确编入索引。
答案 1 :(得分:0)
虽然从两个连接中获得相同的结果,但重要的是要理解左连接与内连接不同。
左连接将从中获取所有行 左表即使没有 在右表中匹配。
因此,您的数据恰好是以两种不同连接相同的方式生成的。
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'
检查索引并确保连接的第二部分的条件不是非索引字符串。