Есть ли какое-либо преимущество использования int vs varbinary для хранения бит-масок с точки зрения производительности или гибкости.
В моих целях я всегда буду читать эти бит-маски (никаких записей или обновлений).
Есть ли какое-либо преимущество использования int vs varbinary для хранения бит-масок с точки зрения производительности или гибкости.
В моих целях я всегда буду читать эти бит-маски (никаких записей или обновлений).
Вы должны обязательно использовать INT
(если вам нужны 32 флага) или BIGINT
(для 64 флагов). Если вам нужно больше флагов, вы можете использовать BINARY
(но вам, вероятно, также следует спросить себя, почему вам нужно столько флагов в вашем приложении).
Кроме того, если вы используете интегральный тип, вы можете использовать стандартный побитовые операторы напрямую, не преобразовывая массив байтов в интегральный тип.
Если вам нужно больше флагов и нужно использовать BINARY
, вы теряете встроенную поддержку для побитовых операторов и, следовательно, легко поддерживаете проверку значений флагов. Я бы, вероятно, переместил проверку значений флага в клиентское приложение, но если вам удобнее программировать в T-SQL, это тоже вариант. Если вы используете С#, у вас есть класс BitArray
с необходимыми операциями, а на Java у вас есть BitSet
.
Обычно считается предпочтительным использовать кучу бит-столбцов вместо битовой маски. Они будут собраны вместе на странице, чтобы они больше не занимали места. Хотя я тоже всегда, кажется, идет с столбцом int или bigint, чтобы избежать ввода имени столбца... но с intellisense я бы, вероятно, пошел с столбцами бит.
Ну, учитывая, что у int меньше места для хранения и, как правило, немного легче работать, я не уверен, почему вы используете varbinary.
Я обычно соглашаюсь с ответом @hainstech на использование битовых полей, потому что вы можете явно указать каждое поле бит, чтобы указать, что он должен хранить. Однако я не видел практического подхода к сопоставлению битмаски с битовыми полями. С помощью побитовых операторов SQL Server (&, | и т.д.) Легко узнать, установлен ли диапазон флагов. Намного больше работы, чтобы сделать это с операторами равенства против большого количества битных полей.