代码之家  ›  专栏  ›  技术社区  ›  AJM

Select中Left Join vs Subquery的奇怪问题

  •  3
  • AJM  · 技术社区  · 14 年前

    我有一个导致性能问题的T-SQL查询。这是一个粗的部分,但似乎是导致一个问题是一个简单的左连接。

    这可以通过删除左连接并在select中使用子查询来解决,但是这对我来说似乎不令人满意,因为我看不出为什么一个工作得很快,而另一个工作得不快。

    涉及的数据不多,所有连接列上都有键/索引。我唯一想知道的是关于数据库的统计数据,以及它们是否会影响性能。

    例如( N、 b.这只是一个更复杂查询的简化

    SELECT A.1,A.2,B.3 FROM A LEFT JOIN B ON A.ID = B.ID ...
    

    SELECT A.1, A.2, (SELECT B.3 FROM B WHERE B.ID = A.ID) FROM A

    2 回复  |  直到 14 年前
        1
  •  1
  •   HLGEM    14 年前

    一般情况下,子查询通常比左连接慢,因此一定有其他情况发生。

    首先显示整个查询,因为问题可能在您使用。。。代表。

    接下来检查你的执行计划,看看有什么不同。你确定id列上有索引吗。FK约束不会自动获取创建的索引。

    两个查询是否返回相同的记录?一个可能更快,因为它不等同于另一个。

        2
  •  0
  •   A-K    14 年前

    这两个查询可能不相等。如果子查询:

    (SELECT B.3 FROM B WHERE B.ID = A.ID)
    

    返回多行,左连接将只返回两行,但子查询将爆炸,并抱怨“子查询返回了多行”。如果B.ID是唯一的,优化器知道吗?是否有唯一的约束或索引?