【问题标题】:Difference between using IN SELECT and INNER JOIN使用 IN SELECT 和 INNER JOIN 的区别
【发布时间】:2018-05-29 00:15:39
【问题描述】:

想知道使用有没有性能差异

SELECT Table1.*
FROM Table1
WHERE Col1 IN (SELECT Col2 FROM Table2)

SELECT Table1.*
FROM Table1 INNER JOIN Table2
ON Table1.Col1 = Table2.Col2

【问题讨论】:

  • 后者一定比前者重复(SELECT Col2 FROM Table2)每Table1行更好
  • 我会说没有任何区别,因为您只是从 Table1 中选择。但是使用第二个查询,您可以从 Table2 返回列。不太清楚它在索引和读取等方面的含义
  • 如果对性能有疑问,请检查 SQL Server Management Studio 中的实际查询计划。
  • @pfx 我没有我们 DBA 执行计划的权限
  • @asmgx 很抱歉,执行计划是查看查询影响的好工具,有助于编写更好的查询。更好的查询使 DBA 更快乐。应该说服他。

标签: sql sql-server performance select inner-join


【解决方案1】:

两者做不同的事情。 in 版本不会返回重复项。 inner join 确实返回重复项。

通常,inner join 版本具有更好的性能,尽管这取决于数据和数据库。

我一般会使用exists:

SELECT t1.*
FROM Table1 t1
WHERE EXISTS (SELECT FROM Table2 t2 WHERE t2.Col2 = t1.col1);

这可以直接利用table2(col2)上的索引。

【讨论】:

    【解决方案2】:

    通常连接会比子查询更快。但有时性能可能取决于表中的数据或其他因素。

    您可以通过 JOIN 或 SUBQUERY 编写您的 SQL,SQL Server 将始终在执行计划上对其进行转换。

    你可以看到更多:https://www.essentialsql.com/what-is-the-difference-between-a-join-and-subquery/

    【讨论】:

      【解决方案3】:
      SELECT Table1.*
      FROM Table1
      WHERE Col1 IN (SELECT Col2 FROM Table2)
      

      在此查询中,我无法在结果集中使用 table2 的任何列。

      如果我需要两个表的列,那么我将使用 INNER JOIN。

      SELECT Table1.*
      FROM Table1 INNER JOIN Table2
      ON Table1.Col1 = Table2.Col2
      

      在一对一的关系中,根据要求,INNER JOIN 会表现得更好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-24
        • 2010-10-08
        • 2014-03-11
        • 2014-05-25
        • 2010-09-07
        相关资源
        最近更新 更多