4
私は、この設計上の課題のためのいくつかのヒントやトリックを探しています

私は反対です:TSQL vbinary bitmaskingとvarbinaryの右側のオペレータ

私はデータベースに保存されている同じサイズのvarbinary型のフィールドのうちの2つをビットマスクの必要性を持っています。明確にするために、これは「パーミッション・テーブル」または何かではありません。私はこれらの種類のアイテムについてデータベースを正規化し、このデータを正規化することはできません。私はアプリケーションが生成するビットの動的記憶域のためのvarbinaryフィールドを格納しています。私はまた別のvarbinaryクエリでこれらのビットを検索しています。 .netではBigInteger型を使用してビットマスキングをすべて処理しますが、この処理をデータベースサーバにオフロードして呼び出し元に渡す前に結果をフィルタリングすることを考えています。現在、私はvarbinary(512)フィールド型までサポートしており、AND演算子とOR演算子の両方を実行し、右側の演算子のビットのANY(OR)またはALL(AND)スルー。 MSDNによれば、右側の演算子であるbigintを使ってvarbinary()を使うことができますが、それを超える必要があります。

私が見つけた素敵な資料は、このトピックに関するAdam Machanicのブログですが、他のアプローチがあるかどうかを調べる前に調べています。

http://sqlblog.com/blogs/adam_machanic/archive/2006/07/12/bitmask-handling-part-3-logical-operators.aspx

これは、SQL 2005以上のためになります。 2008年の機能が2005年に見つからなければ、私はそれでいいだろう、まだ私はまだそれを特定することができませんでした。

何かヒントやトリックをいただければ幸いです。

ありがとうございました。

トラヴィスWhidden

+1

私はまだこの回答が不思議ですが、今は私がテストしたいビットマスキング操作を行うためにSQLでCLR関数を作成しました。 – TravisWhidden

+2

フィルタを適用するフィールドとしてSQL Serverにビットマスクを格納することは、索引付けできない検索であるため、最大の設計ではありません。 (したがって、検索ごとにテーブルスキャンが行われます)。個人的には、マッチングをアプリケーションサーバーにオフロードし、クエリガバナーによって最適化できるクエリに対してdbサーバーを使用します。 –

+0

BigIntが.NETで動作する場合、BigIntはSQLで十分ではありません。 – Paparazzi

答えて

0

ビットマップの最大長さがわかっている場合は、複数の列の上に広げて、個別にマスクすることができます。

しかし、それは本当に面倒です。

関連する問題