SQL Server: varbinary или int для хранения битовой маски? - PullRequest
11 голосов
/ 01 мая 2009

Есть ли преимущество использования int и varbinary для хранения битовых масок с точки зрения производительности или гибкости.

В моих целях я всегда буду выполнять чтение этих битовых масок (без записи или обновления).

Ответы [ 4 ]

15 голосов
/ 01 мая 2009

Вы обязательно должны использовать INT (если вам нужно 32 флага) или BIGINT (для 64 флагов). Если вам нужно больше флагов, вы можете использовать BINARY (но вам, вероятно, также следует спросить себя, зачем вам так много флагов в вашем приложении).

Кроме того, если вы используете целочисленный тип, вы можете использовать стандартные побитовые операторы напрямую, без преобразования байтового массива в целочисленный тип.

Если вам нужно больше флагов и вы должны использовать BINARY, вы теряете встроенную поддержку для побитовых операторов и, следовательно, простую поддержку для проверки значений флагов. Возможно, я бы перенес проверку значений флагов в клиентское приложение, но если вам удобно программировать на T-SQL, это тоже вариант. Если вы используете C #, у вас есть класс BitArray с необходимыми операциями, а в Java у вас есть класс BitSet.

6 голосов
/ 01 мая 2009

Обычно считается предпочтительным использовать набор битовых столбцов вместо битовой маски. Они будут собраны вместе на странице, поэтому они не будут занимать больше места. Хотя я тоже, кажется, всегда иду с столбцом типа int или bigint, чтобы избежать ввода всех имен столбцов ... но с intellisense я бы, вероятно, пошел с битовыми столбцами.

2 голосов
/ 01 мая 2009

Что ж, учитывая, что int имеет меньше места для хранения и, как правило, с ним немного проще работать, я не уверен, зачем вам использовать varbinary.

1 голос
/ 01 мая 2009

Я обычно согласен с ответом @ hainstech об использовании битовых полей, потому что вы можете явно назвать каждое битовое поле, чтобы указать, что оно должно хранить. Однако я не видел практического подхода к сравнению битовых масок с битовыми полями. С помощью побитовых операторов SQL Server (&, |, и т.д ...) легко узнать, установлен ли диапазон флагов. Для этого нужно проделать гораздо больше работы с операторами равенства для большого числа битовых полей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...