Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Использование bit полей  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5503
Блог
Есть реестр услуг. Есть у каждой услуги некие свойства фатически типа boolean (Например ReadOnly)
К-во записей в реестре - порядка нескольких тысяч с средним приростом - сотни в год.
Есть другая таблица, ссылающаяся на реестр. Там записей - единицы миллионов. Прирост - сотни тысяч в год. (тысяча-две в день)
При внесении изменений в эту таблицу должно проверяться - а не ReadOnly ли соответствующая услуга в реестре. Проверятся будет из ХП и, возможно, из триггера.
Так вот вопрос - какого типа делать это поле - bit, smallint, int исходя из наменьшего размера реестра, но без падения быстродействия.

Вообще - насколько битовые поля быстро работают?
19 янв 06, 16:59    [2270437]     Ответить | Цитировать Сообщить модератору
 Re: Использование bit полей  [new]
vooo
Member

Откуда:
Сообщений: 1316
bit конечно
Вообще - насколько битовые поля быстро работают?

а это тут причем ? поле ReadOnly будет проверяться пол какому то условию - важно чтобы эта выборка быстро отработала
19 янв 06, 17:03    [2270458]     Ответить | Цитировать Сообщить модератору
 Re: Использование bit полей  [new]
supeRRRguest
Member

Откуда:
Сообщений: 55
если без индекса, делай null/не null, стопудово быстрее работать будет
если индекс по полю - то bit
19 янв 06, 17:18    [2270544]     Ответить | Цитировать Сообщить модератору
 Re: Использование bit полей  [new]
mekesha
Member

Откуда: Харьков
Сообщений: 300

Хотя таблички самого MS не пестрят использованием упомянутого типа, хотя логических атрибутов там предостаточно... Может они чего-то
знают, может это от лукавого?

Для себя используем другое решение: bitmask int... мало-ли сегодня read-only, завтра еще и required с visible добавятся :-)


Posted via ActualForum NNTP Server 1.3

19 янв 06, 17:24    [2270570]     Ответить | Цитировать Сообщить модератору
 Re: Использование bit полей  [new]
Crimean
Member

Откуда:
Сообщений: 13148
оч часто проще с tinyint работать
19 янв 06, 17:28    [2270586]     Ответить | Цитировать Сообщить модератору
 Re: Использование bit полей  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5503
Блог
mekesha
Для себя используем другое решение: bitmask int... мало-ли сегодня read-only, завтра еще и required с visible добавятся :-)

Ну, это мы тоже используем. Просто ReadOnly - это для примера.
На самом деле признаков много и проверять их в маске не всегда удобно.

А вот насчет NULL/NOT NULL - будет быстрее, чем 1/0?
На каком типе столбца - bit?
19 янв 06, 17:28    [2270590]     Ответить | Цитировать Сообщить модератору
 Re: Использование bit полей  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
автор
К-во записей в реестре - порядка нескольких тысяч с средним приростом - сотни в год.


IMHO, не тот случай, где надо иметь себе головняк с поиском "максимального быстродействия". Поддерживаю Crimean на счет типа данных.
19 янв 06, 17:32    [2270618]     Ответить | Цитировать Сообщить модератору
 Re: Использование bit полей  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5503
Блог
Для определенности:

Таблица Reestr:
Reestr int (PRIMARY KEY)
Code varchar(20),
Name varchar(250),
Куча всего еще :)
ReadOnly bit

ВЫборка такая, например

DECLARE @Reestr int, @Name varchar(250), @ReadOnly bit
SELECT @Reestr=Reestr, @Name=Name, @ReadOnly=ReadOnly 
  FROM Reestr WHERE Reestr=@CheckingReestr
IF @@ROWCOUNT = 0 
  BEGIN
    RAISERROR('Запись %d не найдена', 16, 1, @CheckingReestr)
    ROLLBACK TRAN
    RETURN -1
  END
IF @ReadOnly = 1
  BEGIN
    RAISERROR('Услугу %s менять низя!', 16, 1, @Name)
    ROLLBACK TRAN
    RETURN -1
  END
19 янв 06, 17:34    [2270626]     Ответить | Цитировать Сообщить модератору
 Re: Использование bit полей  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5503
Блог
pkarklin
IMHO, не тот случай, где надо иметь себе головняк с поиском "максимального быстродействия". Поддерживаю Crimean на счет типа данных.

ОК, а для "основной" таблицы, где их миллионы и выше?
Филтрации по этим полям - не предвидится, либо чтение, либо проверка - да/нет
19 янв 06, 17:36    [2270639]     Ответить | Цитировать Сообщить модератору
 Re: Использование bit полей  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
DeColo®es
pkarklin
IMHO, не тот случай, где надо иметь себе головняк с поиском "максимального быстродействия". Поддерживаю Crimean на счет типа данных.

ОК, а для "основной" таблицы, где их миллионы и выше?
Филтрации по этим полям - не предвидится, либо чтение, либо проверка - да/нет


Что бит, что тиниинт занимают 1 байт. Если Вам не надо на клиенте обязательно иметь поле логического типа, то лучше тиниинт.
19 янв 06, 17:43    [2270671]     Ответить | Цитировать Сообщить модератору
 Re: Использование bit полей  [new]
supeRRRguest
Member

Откуда:
Сообщений: 55
ну вот, а просмотр null/не null = просмотр одного бита, поэтому это быстрее всего (но просмотр по индексу быстрее, причем от типа практически не зависит, ставь на это поле индекс и не парься)
19 янв 06, 17:48    [2270691]     Ответить | Цитировать Сообщить модератору
 Re: Использование bit полей  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5503
Блог
pkarklin
Что бит, что тиниинт занимают 1 байт. Если Вам не надо на клиенте обязательно иметь поле логического типа, то лучше тиниинт.

Да, но 8 бит тоже занимают 1 байт! ;)
Даже небольшое сокращение объема данных может привести иногда к существенному повышению быстродействия.
19 янв 06, 18:00    [2270737]     Ответить | Цитировать Сообщить модератору
 Re: Использование bit полей  [new]
supeRRRguest
Member

Откуда:
Сообщений: 55
DeColo®es
pkarklin
Что бит, что тиниинт занимают 1 байт. Если Вам не надо на клиенте обязательно иметь поле логического типа, то лучше тиниинт.

Да, но 8 бит тоже занимают 1 байт! ;)
Даже небольшое сокращение объема данных может привести иногда к существенному повышению быстродействия.


подробнее: в mssql поле типа бит занимает один байт (8 бит)
19 янв 06, 18:04    [2270756]     Ответить | Цитировать Сообщить модератору
 Re: Использование bit полей  [new]
Glory
Member

Откуда:
Сообщений: 104760
supeRRRguest
DeColo®es
pkarklin
Что бит, что тиниинт занимают 1 байт. Если Вам не надо на клиенте обязательно иметь поле логического типа, то лучше тиниинт.

Да, но 8 бит тоже занимают 1 байт! ;)
Даже небольшое сокращение объема данных может привести иногда к существенному повышению быстродействия.


подробнее: в mssql поле типа бит занимает один байт (8 бит)

Неа. тип bit занимает один бит в байте
19 янв 06, 18:09    [2270776]     Ответить | Цитировать Сообщить модератору
 Re: Использование bit полей  [new]
supeRRRguest
Member

Откуда:
Сообщений: 55
Microsoft® SQL Server™ optimizes the storage used for bit columns. If there are 8 or fewer bit columns in a table, the columns are stored as 1 byte. If there are from 9 through 16 bit columns, they are stored as 2 bytes, and so on.

а у него в таблице одно поле bit , так что экономии не будет
19 янв 06, 18:15    [2270801]     Ответить | Цитировать Сообщить модератору
 Re: Использование bit полей  [new]
Glory
Member

Откуда:
Сообщений: 104760
supeRRRguest
Microsoft® SQL Server™ optimizes the storage used for bit columns. If there are 8 or fewer bit columns in a table, the columns are stored as 1 byte. If there are from 9 through 16 bit columns, they are stored as 2 bytes, and so on.

а у него в таблице одно поле bit , так что экономии не будет

Ну это же не означает, что " в mssql поле типа бит занимает один байт (8 бит)"
Это означает, что семь битов не будут использованы.
19 янв 06, 18:18    [2270814]     Ответить | Цитировать Сообщить модератору
 Re: Использование bit полей  [new]
supeRRRguest
Member

Откуда:
Сообщений: 55
вот запорожец - машина 4местная, но красивые женщины в нее не садятся принципиально
вопрос: сколько к.ж. можно увезти с собой?

p.s. такие методы как напоить, предварительно сбить и т.д. приравниваются к наличию нескольких полей bit в таблице :-)
19 янв 06, 18:23    [2270831]     Ответить | Цитировать Сообщить модератору
 Re: Использование bit полей  [new]
Glory
Member

Откуда:
Сообщений: 104760
supeRRRguest
вот запорожец - машина 4местная, но красивые женщины в нее не садятся принципиально
вопрос: сколько к.ж. можно увезти с собой?

p.s. такие методы как напоить, предварительно сбить и т.д. приравниваются к наличию нескольких полей bit в таблице :-)

Это вы к чему ? Или вы считате, что ваше утверждение "в mssql поле типа бит занимает один байт (8 бит)" истинно ?
19 янв 06, 18:25    [2270841]     Ответить | Цитировать Сообщить модератору
 Re: Использование bit полей  [new]
Glory
Member

Откуда:
Сообщений: 104760
Если речь идет об экономии места, то наиболее экономым выглядит столбец типа varchar(1), значение которого определяется по признаку [NOT] NULL.
Конечно, если число NULL значений будет велико.
Иначе подходит любой другой однобайтовый тип данных
19 янв 06, 18:40    [2270885]     Ответить | Цитировать Сообщить модератору
 Re: Использование bit полей  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5503
Блог
supeRRRguest
Microsoft® SQL Server™ optimizes the storage used for bit columns. If there are 8 or fewer bit columns in a table, the columns are stored as 1 byte. If there are from 9 through 16 bit columns, they are stored as 2 bytes, and so on.

а у него в таблице одно поле bit , так что экономии не будет

А вот не надо грязи! :)
Кто сказал, что одно?
Я только спрашивал - ЧТО БЫСТРЕЕ.
19 янв 06, 18:51    [2270911]     Ответить | Цитировать Сообщить модератору
 Re: Использование bit полей  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5503
Блог
Я просто про что думаю - иногда определенные типы данных обрабатываются намного быстрее других. Например - выровненные по разрядности процессора.
Иногда битовые данные работают существенно медленнее других.
Просто если кто-то сталкивался....
19 янв 06, 18:54    [2270920]     Ответить | Цитировать Сообщить модератору
 Re: Использование bit полей  [new]
ChA
Member

Откуда: Москва
Сообщений: 11126
DeColo®es
просто про что думаю - иногда определенные типы данных обрабатываются намного быстрее других. Например - выровненные по разрядности процессора.
IMHO, не стоит особо заморачиваться, особенно выравниванием "по разрядности процессора" и/или экономией пространства путем замены байта на биты, если таковых относительно немного, что определяется по месту. В частности тем, насколько это может увеличить поток ввода-вывода, который, обычно, и определяет общую производительность сервера, а не время работы процессора с bit- или int-типами. В то же время, надо тщательно следить за конвертациями, чтобы их было поменьше, и с нужной стороны, а то может получится, что битовое поле постоянно будет конвертироваться в один из целочисленных типов при сравнении или слиянии в запросах. На этом можете гораздо больше потерять, чем на "выравнивании".
Собственно, спич к тому, что производительность при работе с БД надо искать в других местах :)
19 янв 06, 20:55    [2271124]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить