优化SQL中的按位过滤

时间:2009-08-12 22:32:22

标签: 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 - 是否有这种情况不属实?

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

有人有一些惊人的数学来帮助我吗?

1 个答案:

答案 0 :(得分:1)

只要您处理无符号整数(无论是作为mysql中的列类型,还是作为其他dbs中的约束),那么这是真的:

(A & B == A) implies (B >= A) *not* (A >= B)

它的数学运算是B必须包含A组中的所有位,可能还有更多位。如果A中没有设置A的单个位,那么A& B!= A。

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

此外,一旦你进入负数,你可能会遇到A&amp; B = A,但B <甲

还有一件事:(A&amp; B = A)包括(A = B)的情况,所以说

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

是多余的。除非你能看到SQL引擎的速度差异,否则删除(A = B)。