优化SQL中的按位过滤

优化SQL中的按位过滤,sql,optimization,bitwise-operators,Sql,Optimization,Bitwise Operators,我正在使用SQL实现一个位过滤器,我想看看下面的优化是否在所有情况下都是有效的,我不知道如何证明它。 我的目标是限制要比较的行数 标准筛选器伪sql: IF (A & B = A) // SHOW VALUE 问题是,加上这个行吗 IF (A = B) OR (A & B = A) WHERE (B >= A) // SHOW VALUE 在我看来,B必须总是>=到A-有没有这种情况是不正确的 我意识到上面的代码仍然不是最优的,我只是想知道这是否是一个可行的方向 有人有

我正在使用SQL实现一个位过滤器,我想看看下面的优化是否在所有情况下都是有效的,我不知道如何证明它。 我的目标是限制要比较的行数

标准筛选器伪sql:

IF (A & B = A) // SHOW VALUE
问题是,加上这个行吗

IF (A = B) OR (A & B = A) WHERE (B >= A) // SHOW VALUE
在我看来,B必须总是>=到A-有没有这种情况是不正确的

我意识到上面的代码仍然不是最优的,我只是想知道这是否是一个可行的方向


有人有一些很棒的数学来帮我吗

只要您处理的是无符号整数(无论是mysql中的列类型,还是其他dbs中的CONTAint),那么这是正确的:

(A & B == A) implies (B >= A) *not* (A >= B)
它的数学原理是B必须有一个集合中的所有位,甚至可能更多。如果B中未设置a中的单个位,则a&B!=A

(请注意,反过来并不总是正确的:(B>=A)并不意味着(A&B==A)。作为一个简单的反例,5>3,但3&5=1。)

而且,一旦你进入负数,你可能会遇到A&B=A,但B 还有一件事:(A&B=A)包括(A=B)的情况,所以

IF (A = B) OR (A & B = A) ...

这是多余的。删除(A=B),除非您可以看到SQL引擎的速度差异。

感谢阅读障碍检查-我编辑了问题以反映良好的数学。