【问题标题】:Is Join or Where clause approach more efficient in restricting result set?Join 或 Where 子句方法在限制结果集方面是否更有效?
【发布时间】:2011-05-01 15:02:10
【问题描述】:

我需要限制基于 Col1 的 SELECT 语句的结果集具有一对多的潜在值。例如,我想返回 Col1 等于 1、2 和 3 的所有行。

到目前为止,我有两种不同的方法来限制结果集:

方法#1

Inner Join Table1 On (Table2.ColA=Table1.ColA) And (Col1=1 And Col1=2 And Col1=3)

方法 #2

Inner Join Table1 On Table2.ColA=Table1.ColA
Where (Col1=1 And Col1=2 And Col1=3)

是首选其中一种方法还是有更有效的替代方法?这些值是动态的,每次调用时都会传递给存储过程。

谢谢, 克里斯

【问题讨论】:

  • 查询计划怎么说?我个人更喜欢(并且我认为其他人会同意)方法 #2,因为它的读取方式与您实际尝试完成的方式非常相似。
  • Col1 不能同时等于 1 2 和 3。 1 != 2 != 3。另外,两个表中最好不要有 Col1。
  • 实际查询比较复杂,我只是通过保持示例简单来寻找基本原理。

标签: sql sql-server tsql join


【解决方案1】:

内部联接

在处理 INNER JOIN 时,对要连接的表的过滤是否遵循 ON 子句或发生在 WHERE 子句中都没有关系——它会产生相同的结果集。

外连接

但对于 OUTER JOIN,情况并非如此...
在 OUTER JOIN 中,如果您在 ON 子句中指定过滤条件 - 条件将在之前应用,然后进行 JOIN。这是一个例子:

     FROM TABLE_1 a
LEFT JOIN TABLE_2 b ON b.cola = a.cola
                   AND b.col1 IN (1,2,3)

与在 WHERE 中指定条件相比,这可能会极大地影响结果集:

     FROM TABLE_1 a
LEFT JOIN TABLE_2 b ON b.cola = a.cola
    WHERE b.col1 IN (1,2,3)

结论

重要的是你:

  1. 了解区别
  2. 在您的查询结构中保持一致

【讨论】:

    【解决方案2】:

    这不是效率问题。您的限制限制了将返回的行;因此它们在逻辑上属于 WHERE 子句。

    【讨论】:

    • +1 - 我想如果你检查一下你会发现查询计划是一样的,但是WHERE 子句更有意义并且更容易阅读。
    【解决方案3】:

    预先清理的 WHERE(子查询),但检查查询计划是否有差异:

    SELECT ...
    FROM   ...
    JOIN   (select ... from table1 where col1 in (1,2,3) ) as Table1
    ON     Table1.ColA = Table2.ColA
    

    【讨论】:

      【解决方案4】:

      您的描述是“1、2 或 3”,所以您会想要

      Where (Col1=1 Or Col1=2 Or Col1=3)
      

      或者你可以这样做

      Where Col1 in (1, 2, 3)
      

      【讨论】:

        【解决方案5】:

        没关系,优化器最终会产生相同的查询。我认为 WHERE 子句中的过滤更具可读性,尤其是对于内部连接。

        【讨论】:

          猜你喜欢
          • 2011-06-09
          • 1970-01-01
          • 2015-10-31
          • 2021-05-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-16
          相关资源
          最近更新 更多