bit(2000)型の列ベクトルを持つテーブルがあります。dbエンジンは、この値に対する操作ANDおよびORをどのように処理しますか?単純に32ビットチャンク(またはそれぞれ64)に分割してから、各チャンクを個別に比較し、最終的に結果を単純に連結しますか?それとも単に2つの文字列として処理しますか?
私のポイントは、どちらのユースケースがより速いかを予測することです。Key-Valueデータ(user-item)を取得しました。
userID | itemID
U1 | I1
U1 | Ix
Un | Ij
ユーザーごとに、n個の最近傍のリストを計算します(たとえば、ジャッカード係数を使用)。
select my_jaccard(select itemID from table where userID=U1,select itemID from table where userID=U2)
私の解決策-入力データをユーザーベクトルのテーブルに解析しました。ベクトルはタイプbit(2000)で、特定のアイテムを表す位置に1が付いています。
userID | vector
U1 | 00.......01
U1 | 0..1.....00
Un | 00..1..1..0
このテーブルで私は単にします
select vector1&vector2
重要なのは、各ユーザーがすべてのアイテムに対して最大10個のレコードしか持たないことです。つまり、ベクトルには最大10個のアクティブビットがあります。私は、アクティブなビットを見つけるためだけにビットベクトル全体を解析するには、user1の10個の値をuser2の10個の値と単純に比較するよりも多くの計算リソースが必要だと思います。
1に設定されたビットが非常に少ない長いビットベクトルを使用する方が速いですか、それとも元の値をセットとして使用して2つのセットを比較する方が良いですか?(セットは最大10アイテム)
私はpsqlv8.2とv9.xの両方を使用しています