SQL Server:ビットマスクを保存するためのvarbinaryまたはint?
-
03-07-2019 - |
質問
ビットマスクを格納するために、パフォーマンスまたは柔軟性の点でint対varbinaryを使用する利点はあります。
目的のために、私は常にこれらのビットマスクで読み取りを行います(書き込みや更新は行いません)。
解決
INT
(32フラグが必要な場合)または BIGINT
(64フラグ用)を必ず使用する必要があります。さらにフラグが必要な場合は、 BINARY
を使用できます。 a>(ただし、アプリケーションでこれほど多くのフラグが必要な理由を自問する必要があります。)
さらに、整数型を使用する場合は、標準のビット演算子を使用できます。 バイト配列を整数型に変換せずに直接。
さらにフラグが必要で BINARY
を使用する必要がある場合、ビット演算子のネイティブサポートが失われるため、フラグ値のチェックが簡単にサポートされます。おそらくフラグ値のチェックをクライアントアプリケーションに移動しますが、T-SQLでのプログラミングに慣れている場合は、これもオプションです。 C#を使用している場合、 BitArray
クラスに必要な操作があり、Javaには BitSet
クラス。
他のヒント
ビットマスクの代わりにビット列の束を使用することが一般的に好ましいと考えられています。それらはページに一緒に詰め込まれますので、それ以上のスペースを取ることはありません。私も常にすべての列名の入力を避けるためにintまたはbigint列を使用するようですが、インテリセンスではおそらくビット列を使用します。
まあ、intの方がストレージ容量が少なく、一般的に作業が少し簡単だと考えると、なぜvarbinaryを使用するのかわかりません。
通常、ビットフィールドを使用するという@hainstechの回答に同意します。これは、各ビットフィールドに明示的に名前を付けて、格納する内容を示すことができるためです。しかし、ビットフィールドとビットマスク比較を行うための実用的なアプローチを見たことはありません。 SQL Serverのビット演算子(&、|など)を使用すると、一連のフラグが設定されているかどうかを簡単に確認できます。多数のビットフィールドに対する等価演算子を使用してこれを行うには、さらに多くの作業が必要です。