Sql server 2008 SQL查询:布尔处理

Sql server 2008 SQL查询:布尔处理,sql-server-2008,tsql,Sql Server 2008,Tsql,我不知道这是不是一个合适的论坛。假设我有以下几点: 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-2

我不知道这是不是一个合适的论坛。假设我有以下几点:

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中意味着,如果第一个案例失败,那么继续下去,这里就没有什么更有趣的了。如果你把最有可能是错误的案例作为第一对,你会改进得更多


我将有兴趣听到其他人关于这个

我的理解是,您的第一个案例更有效,因为:

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

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

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

将OR条件嵌套在AND中意味着,如果第一个案例失败,那么继续下去,这里就没有什么更有趣的了。如果你把最有可能是错误的案例作为第一对,你会改进得更多


我将有兴趣听到其他人关于这个

所以第一个语句的最佳情况是A:False+B:False,只有两个求值。在这种情况下,第二条语句也只计算A+B。它们在逻辑上是等价的,因此如果SQL Server足够聪明,能够解决这个问题,就不会有什么区别。这就是我假设的正确答案。我同意它们在逻辑上是等价的,但我相信操作顺序(由括号指示)对某些编译器来说很重要,而对其他编译器来说则不重要。我同意-我也很想知道在案例2中是否每次都对A进行评估。所以第一个陈述的最佳案例是A:False+B:False,只有两次评估。在这种情况下,第二条语句也只计算A+B。它们在逻辑上是等价的,因此如果SQL Server足够聪明,能够解决这个问题,就不会有什么区别。这就是我假设的正确答案。我同意它们在逻辑上是等价的,但我相信操作顺序(由括号指示)对某些编译器来说很重要,而对其他编译器来说则不重要。我同意-我也很想知道在案例2中是否每次都对A进行评估。有趣的问题-+1查询优化器保留所有权利,可以随意调整。根据统计数据和索引,它可能会做一些出乎意料的事情。也就是说,我将使用您的第一个示例,因为它对普通读者来说似乎更清晰。该用例实际上是针对生成的SQL的,因此用户将不会看到它,除非进行相对罕见的调试。有趣的问题-+1查询优化器保留对所有内容进行无序处理的所有权利。根据统计数据和索引,它可能会做一些出乎意料的事情。也就是说,我将使用您的第一个示例,因为它对普通读者来说似乎更清晰。该用例实际上是用于生成SQL的,因此用户除了相对罕见的调试之外不会看到它。