0

我们的数据库中有逻辑删除,每个表都有一个“已删除”标志,这是一个可以为空的日期时间字段。

Deleted DATETIME NULL

在我们的查询中,我使用以下模式:

SELECT *
FROM TableA a
INNER JOIN TableB b 
   ON b.id = a.pkid
   AND b.deleted IS NULL
INNER JOIN TableC c
   ON c.id = b.pkid
   AND c.deleted IS NULL
WHERE a.deleted IS NULL

是否比以下更有效:

SELECT *
FROM TableA a
INNER JOIN TableB b 
   ON b.id = a.pkid
INNER JOIN TableC c
   ON c.id = b.pkid
WHERE a.deleted IS NULL
AND b.deleted IS NULL
AND c.deleted IS NULL

我知道当左连接进入它时,父母会改变。我在这里谈论的是 INNER 加入。

我认为第一个更有效,因为服务器执行查询的方式。我找不到我看到的有关阶段的页面...即首先是联接,然后是位置,然后是订单,然后是选择...但是第一个示例会限制数据,然后触发位置,所以 WHERE 覆盖的数据更少?

4

1 回答 1

1

您还可以将 a 上的谓词添加到第一个连接...

SELECT *
FROM TableA a
   JOIN TableB b 
      ON b.id = a.pkid
         AND a.deleted IS NULL
         AND b.deleted IS NULL
   JOIN TableC c
      ON c.id = b.pkid
         AND c.deleted IS NULL

但是,一般来说,依靠一种特定的句法方法来产生比另一种更好或更差的性能是不可靠的。查询优化器可以做一些奇怪的事情,经常将两个截然不同的查询变成同一个计划。尝试它们并查看查询计划以查看会发生什么。

于 2013-10-16T00:29:49.517 回答