0

SQL を使用してビット単位のフィルターを実装しています。次の最適化がすべての場合に常に有効かどうかを確認したいのですが、それを証明する方法がわかりません。私の目標は、比較される行数を制限することです。

標準フィルター疑似 SQL:

IF (A & B = A) // SHOW VALUE

問題は、これを追加しても機能するかどうかです。:

IF (A = B) OR (A & B = A) WHERE (B >= A) // SHOW VALUE

B は常に A に対して >= でなければならないように思えます - これが正しくない場合はありますか?

上記のコードはまだ最適ではないことを認識しています。これが実行可能な方向であるかどうかを知りたいだけです。

誰かが私を助ける素晴らしい数学を持っていますか?

4

1 に答える 1

1

unsigned int を扱っている限り (mysql の列の型であろうと、他のデータベースの制約であろうと)、これは当てはまります。

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

これを計算すると、B には A セットのすべてのビットが必要であり、場合によってはそれ以上のビットが必要です。A からの単一ビットが B に設定されていない場合、A & B != A.

(逆は常に真であるとは限らないことに注意してください: (B >= A) は (A & B == A) を意味するわけではありません。単純な反例として、5 > 3 ですが、3 & 5 = 1 です。)

また、負の数になるとすぐに、A & B = A であるが B < A という状況に遭遇する可能性があります。

もう1つ: (A & B = A) には (A = B) の場合が含まれるので、

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

冗長です。SQL エンジンで速度の違いが見られない限り、(A = B) を削除します。

于 2009-08-12T22:58:10.690 に答える