SQL内部vs左连接问题

时间:2011-06-30 00:38:42

标签: sql sql-server performance sql-server-2005 tsql

我有一个非常糟糕的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返回的结果是相同的,左边明显更快......

2 个答案:

答案 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)

虽然从两个连接中获得相同的结果,但重要的是要理解左连接与内连接不同。

  

左连接将从中获取所有行   左表即使没有   在右表中匹配。

SQL LEFT JOINSQL INNER JOIN

因此,您的数据恰好是以两种不同连接相同的方式生成的。

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'

检查索引并确保连接的第二部分的条件不是非索引字符串。