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