SQL查询:布尔处理



我不知道这是否是合适的论坛。假设我有以下内容:

SELECT *
FROM MyTable m
WHERE ((A OR B) AND (C OR D))

假设A、B、C、D是适当的布尔子句,每个子句都需要在行级别的基础上进行求值。我们也假设没有索引。

这在逻辑上等同于:

SELECT *
FROM MyTable m
WHERE (A AND C)
   OR (A AND D)
   OR (B AND C)
   OR (B AND D)

任何一种都有性能优势吗?我们在MSSql-2008上。

我的理解是,您的第一种情况更有效,因为:

在本条中:其中((A或B)和(C或D))

如果A或B都不为真,则整个陈述失败;语句的第二部分(C或D)不进行求值。即使A或B为真,也只有一对需要检查——C或D。最糟糕的情况是,在评估整个语句之前,要检查四个条件(如果A=假,B=假,C=假,但D=真)。最好的情况是,只检查A和B后,语句变为false。如果两者都不为true,则整个语句为false。

在第二种情况下,必须先评估四种情况中的每一种,然后才能评估整个语句。

将OR条件嵌套在AND中意味着,如果第一种情况失败,那么就没有什么更有趣的了。如果你把最有可能是假的情况作为第一对,你会改进得更多。

我很想听听其他人对此的看法。

最新更新