在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应该使用条件满足的较小行集来执行。我对吗?如果是这样,后期版本不应该提供更好的性能吗?
答案 0 :(得分:1)
无论如何,db引擎最终会得到相同的执行计划,并且没有办法改进这个查询的编写(这里不讨论索引)。
至于最佳做法,我会将c2.AccountId = 2
放入WHERE
因为常量(这是有人可能编辑的内容,用于更改查询的选择,而连接则更多是行为相关的,不应该受到这种修改)。
但我通常会看到这两个着作并把它放在JOIN
并不会让我感到震惊: - )
答案 1 :(得分:1)
使用新的JOIN语法有以下几个原因:
答案 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