SQL: что лучше, бит или символ (1) - PullRequest
11 голосов
/ 24 февраля 2011

Есть ли производительность разница при получении бита или символа (1)?

Просто для любопытства =]

ОБНОВЛЕНИЕ: Предполагается, что я использую SQL Server 2008!

Ответы [ 5 ]

18 голосов
/ 24 февраля 2011

Для SQL Server: до 8 столбцов типа BIT может храниться в одном байте, тогда как каждый столбец типа CHAR(1) будет занимать один байт.

С другой стороны: aСтолбец BIT может иметь два значения (0 = false, 1 = true) или вообще не иметь значения (NULL) - в то время как CHAR(1) может иметь любое символьное значение (гораздо больше возможностей)

Так что на самом деле,это сводится к:

  • вам действительно нужно поле true / false (да / нет)?Если так: используйте BIT
  • , нужно ли вам что-то с более чем двумя возможными значениями - используйте CHAR(1)

Я не думаю, что это имеет какое-либо существенное отличие отс точки зрения производительности - если у вас нет десятков тысяч столбцов.Тогда, конечно, было бы полезно использовать BIT, который может хранить до 8 столбцов в одном байте.Но опять же: для вашего «нормального» случая с базой данных, где у вас есть несколько, дюжина таких столбцов, это действительно не имеет большого значения.Выберите тип столбца, который соответствует вашим потребностям - не беспокойтесь о производительности .....

3 голосов
/ 24 февраля 2011

бит, и символ (1) займет 1 байт для хранения, при условии, что в таблице только 1-битный столбец, SQL Server будет хранить до 8-битных столбцов в 1 байт.Я не думаю, что есть разница в производительности.

Следует помнить одну вещь: вы не можете делать сумму в битовом столбце

CREATE TABLE #test( a BIT)

INSERT #test VALUES (1)
INSERT #test VALUES (1)

SELECT sum(a) FROM #test

Сообщение 8117, Уровень 16, Состояние 1, Строка 1
Бит типа данных операнда недопустим для оператора сумм.

сначала необходимо преобразовать его

SELECT sum(CONVERT(INT,a)) FROM #test
3 голосов
/ 24 февраля 2011

Это зависит от реализации.Одна СУБД может иметь одинаковую производительность, а другая - отличаться.

1 голос
/ 24 февраля 2011

Как говорит Адам, это зависит от базы данных, правильно реализующей типы данных, но теоретически справедливо следующее:

Бит:

Будет хранить 1, 0 или нольДля сохранения значения требуется только бит (по определению!).Обычно используется для true или false, и многие языки программирования автоматически интерпретируют бит как поле true или false.

Char [1]:

Символ занимает 8 бит или один байт,поэтому его в 8 раз больше при хранении.Вы можете хранить (в значительной степени) любого персонажа там.Вероятно, будет интерпретироваться как строка языками программирования.Я думаю, что Char [1] всегда будет брать полный байт, даже если он пустой, если вы не используете varchar или nvarchar.

0 голосов
/ 01 марта 2011

используйте немного.ВСЕГДА используйте наименьший возможный тип данных.это важно, когда вы начинаете получать большие таблицы.

...