Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL内部与左连接问题_Sql_Sql Server_Performance_Sql Server 2005_Tsql - Fatal编程技术网

SQL内部与左连接问题

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

我有一个非常糟糕的sql查询。我跟踪到了表上执行的内部联接。将此连接更改为左连接可显著提高性能(从6分钟提高到20秒)-现在我知道2不相等,但。。。这就是我要问的

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连接已经存在了几十年,并在多个数据库中实现。他们可能是对的。
内部连接
左连接
不同,但它们并不总是给出不同的结果。如果左边桌子的每一行在右边桌子上都有一个匹配项,那么它们是等价的。我同意,这就是我所说的。