查询优化 - 使用JOIN而不是WHERE子句的条件

时间:2013-03-02 23:49:50

标签: sql sql-server-2008-r2 query-optimization

在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行)哪一个是合适的选择?

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

修改:实际上条件为c2.AccountId = @accountId,其中@accountId是SP的参数

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

3 个答案:

答案 0 :(得分:1)

无论如何,db引擎最终会得到相同的执行计划,并且没有办法改进这个查询的编写(这里不讨论索引)。

至于最佳做法,我会将c2.AccountId = 2放入WHERE因为常量(这是有人可能编辑的内容,用于更改查询的选择,而连接则更多是行为相关的,不应该受到这种修改)。

但我通常会看到这两个着作并把它放在JOIN并不会让我感到震惊: - )

答案 1 :(得分:1)

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

  • 代码更具可读性。
  • 它更好地描述了查询的意图,允许更有效/更好的优化。
  • 对于这些子句的语义不同,OUTER JOINS不会遇到问题。

答案 2 :(得分: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