1

在 SP 内部,我需要找出Code与第二个帐户的任何客户匹配的第一个帐户的一些客户的 ID。我写了以下有效的查询 -

    SELECT DISTINCT cil.Id FROM ClientIdList AS cil
    INNER JOIN Client AS c1
    ON cil.Id = c1.Id
    INNER JOIN Client AS c2
    ON c1.Code = c2.Code
    WHERE c2.AccountId = 2
    ORDER BY cil.Id  

ClientIdList是一个单列表类型的变量,它保存了第一个帐户中选定客户的 ID(在此之前我需要将此变量用于其他要求)。WHERE如果我将条件放在子句中,我可以获得相同的正确输出JOIN,如下所示 -

    SELECT DISTINCT cil.Id FROM ClientIdList AS cil
    INNER JOIN Client AS c1
    ON cil.Id = c1.Id
    INNER JOIN Client AS c2
    ON c1.Code = c2.Code AND c2.AccountId = 2
    ORDER BY cil.Id  

考虑到每个帐户有 2000 个帐户和 10000 个客户(即Client表中的 2000 x 10000 行),哪一个是合适的选择?

可以进一步优化查询以提高性能吗?

编辑:实际上条件是SP 的c2.AccountId = @accountId参数@accountId

编辑 2:据我所知,使用 WHERE 子句版本,将与 Client 表的其余部分一起执行 JOIN,然后将根据 WHERE 条件过滤结果。但是对于更高版本的 JOIN 应该使用满足条件的较小行集来执行。我对吗?如果是这样,以后的版本不应该提供更好的性能吗?

4

3 回答 3

1

不管怎样,数据库引擎最终会得到相同的执行计划,并且没有办法改进这个查询的编写(这里不讨论索引)。

至于最佳实践,我会将其c2.AccountId = 2放入,WHERE因为常量(这是有人可能会编辑以更改查询选择的内容,而联接更多与行为相关,不应受到这种修改) .

但我通常会看到这两篇文章,把它放在里面JOIN并不会让我感到那么震惊:-)

于 2013-03-03T00:10:58.613 回答
1

使用新的 JOIN 语法有几个原因:

  • 代码更具可读性。
  • 它更好地描述了查询的意图,允许更有效/更好的优化。
  • 在这些子句的语义不同的情况下,您不会遇到 OUTER JOINS 的问题。
于 2013-03-03T00:16:46.077 回答
0

两个查询都提供相同的性能。您可以优化您的查询删除第二个 JOIN

SELECT DISTINCT cil.Id 
FROM ClientIdList AS cil JOIN Client AS c ON cil.Id = c.Id                          
WHERE c.AccountId = 2
ORDER BY cil.Id 
于 2013-03-03T01:33:14.590 回答