Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Использовать ли NULL?  [new]
lex452
Member

Откуда:
Сообщений: 534
Есть таблица в которой в столбце возможны лишь значения 1,2,3. Задался вопросом, когда для этого столбца нет значения, что лучше использовать значение 0 или NULL. В дальнейшем по этому полю будет строиться индекс с фильтром is not null или !=0. Вопрос в том, будет ли выигрыш при запросе по этому полю и по занимаемому месту если использовать null вместо 0.
Объемы данных несколько десятков миллионов.
В одних источниках пишут что для фиксированных типов null и любое другое значение места занимают одинаково.
Подскажите стоит ли использовать значение null и даст ли это уменьшение занимаемого места данными и повышение производительности при запросах?
21 май 17, 23:21    [20499910]     Ответить | Цитировать Сообщить модератору
 Re: Использовать ли NULL?  [new]
мегамозг
Member

Откуда: Екатеринбург
Сообщений: 71
lex452
Есть таблица в которой в столбце возможны лишь значения 1,2,3. Задался вопросом, когда для этого столбца нет значения, что лучше использовать значение 0 или NULL. В дальнейшем по этому полю будет строиться индекс с фильтром is not null или !=0...

А какой смысл строить индекс по полю с 3 возможными значениями?
22 май 17, 07:52    [20500157]     Ответить | Цитировать Сообщить модератору
 Re: Использовать ли NULL?  [new]
aleksrov
Member

Откуда:
Сообщений: 948
lex452,

Как вам написали выше, нет обсалютно никакого смысла строить индекс по полю с 3 значениями. SQL использует этот индекс лишь в нескольких случаях: первое когда вы сделаете запрос вида
select my_column_1_2_3
from table

тогда оптимизатор посчитает, что скорее всего будет дешевле просканировать индекс, который, как правило, занимает меньше страниц чем вся таблица целиком.
Или когда вы выполните запрос вида
select my_column_1_2_3
from table
where my_column_1_2_3 = 1

если статистика свежая, таблица большая, а значений 1 немного и SQL не придется делать кучу RID\KEY Lookup, то он выбирет этот индекс. В отсальных случаях он будет бесполезен, но он будет занимать доп. место, его придется обновлять когда вствите\удалите строку или обновите поле которое есть в индексе.
22 май 17, 08:58    [20500254]     Ответить | Цитировать Сообщить модератору
 Re: Использовать ли NULL?  [new]
roundabout
Member

Откуда:
Сообщений: 13
0 и NULL разные вещи, на пример на 0 делить нельзя, на NULL можно. NULL никогда случайно не попадёт не в один диапазон <0 или
>=0. Мое мнение NULL можно и нужно использовать, но только там где действительно ничего нет.
22 май 17, 10:17    [20500469]     Ответить | Цитировать Сообщить модератору
 Re: Использовать ли NULL?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20223
lex452
Есть таблица в которой в столбце возможны лишь значения 1,2,3. Задался вопросом, когда для этого столбца нет значения, что лучше использовать значение 0 или NULL.
Трансформируйте в набор значений а-ля флаг (т.е. 1, 2 и 4), и вопрос сам отвалится.
22 май 17, 10:21    [20500484]     Ответить | Цитировать Сообщить модератору
 Re: Использовать ли NULL?  [new]
lex452
Member

Откуда:
Сообщений: 534
Давайте предположим что поле не индексированное, арифметических операций мне по нему не проводить, записей несколько десятков миллионов, допустим треть из них это пустое значение. У столбца тип данных tinyint. Будет ли выигрыш по свободному месту если использовать NULL вместо 0? Подобных столбцов в таблице несколько.
22 май 17, 15:59    [20501718]     Ответить | Цитировать Сообщить модератору
 Re: Использовать ли NULL?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
lex452
Давайте предположим что поле не индексированное, арифметических операций мне по нему не проводить, записей несколько десятков миллионов, допустим треть из них это пустое значение. У столбца тип данных tinyint. Будет ли выигрыш по свободному месту если использовать NULL вместо 0? Подобных столбцов в таблице несколько.

int фиксированный тип, ответ - нет
если действительно 30% пустых то SPARSE NULL
22 май 17, 16:06    [20501752]     Ответить | Цитировать Сообщить модератору
 Re: Использовать ли NULL?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
хотя нет... для int от 64%
22 май 17, 16:07    [20501755]     Ответить | Цитировать Сообщить модератору
 Re: Использовать ли NULL?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
а у вас tinyint :) 86%
22 май 17, 16:07    [20501757]     Ответить | Цитировать Сообщить модератору
 Re: Использовать ли NULL?  [new]
o-o
Guest
lex452
Давайте предположим что поле не индексированное, арифметических операций мне по нему не проводить, записей несколько десятков миллионов, допустим треть из них это пустое значение. У столбца тип данных tinyint. Будет ли выигрыш по свободному месту если использовать NULL вместо 0? Подобных столбцов в таблице несколько.

выигрыш по месту будет при использовании NULL
и variable-length типе, например varchar(1).
колонка(и) с предполагаемыми NULL-ами должна быть последней.
потому что если тип variable-length, то NULL не хранится,
но зато всегда присутствует column offset, и это 2 байта.
исключение: когда NULL это последняя колонка (или последние n колонок)
только в этом случае не будет и column offset-а
22 май 17, 16:15    [20501783]     Ответить | Цитировать Сообщить модератору
 Re: Использовать ли NULL?  [new]
lex452
Member

Откуда:
Сообщений: 534
TaPaK
int фиксированный тип, ответ - нет

Вот такой ответ вполне подходит, спасибо.
22 май 17, 21:45    [20502631]     Ответить | Цитировать Сообщить модератору
 Re: Использовать ли NULL?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36698
Для "объемы данных несколько десятков миллионов" вы вообще не там ищите способы ускорения и экономии.
22 май 17, 22:21    [20502695]     Ответить | Цитировать Сообщить модератору
 Re: Использовать ли NULL?  [new]
lex452
Member

Откуда:
Сообщений: 534
Гавриленко Сергей Алексеевич,

Дайте совет где искать, может я чего то не понимаю. И мои объемы это много или в ваших словах есть сарказм?
22 май 17, 22:32    [20502720]     Ответить | Цитировать Сообщить модератору
 Re: Использовать ли NULL?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36698
lex452
Гавриленко Сергей Алексеевич,

Дайте совет где искать, может я чего то не понимаю. И мои объемы это много или в ваших словах есть сарказм?
Не сарказм, просто толстый намек, что не тем занимаетесь (если только цель не самообразование).

Или у вас тормозит что-то?
22 май 17, 22:39    [20502738]     Ответить | Цитировать Сообщить модератору
 Re: Использовать ли NULL?  [new]
lex452
Member

Откуда:
Сообщений: 534
Гавриленко Сергей Алексеевич,

Самообразование тоже, не хочется доводить чтобы тормозило. Просто баз таких много и свободное место заканчивается, вот и ищу способы оптимизации и экономии.
22 май 17, 22:43    [20502745]     Ответить | Цитировать Сообщить модератору
 Re: Использовать ли NULL?  [new]
aleksrov
Member

Откуда:
Сообщений: 948
lex452,

Вот если заканчивается место, то добавление ненужного индекса точно не поможет.
Какая версия та у вас хоть?
К тому что написал о-о что когда Null variable столбец последний экономия может быть до 4 байт, к примеру у вас таблица int, int, varchar(1), на певом int уникальный класт. индекс (если он не уникальный доп расходы могут быть до 8 байт) и если последнее будет null то строка будет занимать 15 байт (7 сл. инф. + 4 + 4), если у вас vaкchar будет 1, то уже 20 (1 байт сама информация, 2 байт offset и 2 байт кол-во столбцов переменной длины), если в строке уже есть не null varchar тип, то последних 2 байта не прибавится, а только 2 байта на offset.
При tinyint у вас процентов 80% должно быть Null чтобы был смысл использовать Sparse. Sparse Column не будет вообще использовать место если у вас Null значения, но прибавит 4 байта к вашему tinyint если он не Null (если бы он был variable то 2).
И как вам уже писали нет смысла строить индекс с такими значениями, если вы используете предикат !=0, т.е. исключите из запроса к примеру 30% строк, оптимизатор не будет использовать этот индекс, а просто просканирует таблицу, т.к. делать миллион Lookup'ов он точно не будет, а вот индекс, как сказано выше, имеет свою стоимость.
23 май 17, 05:21    [20502996]     Ответить | Цитировать Сообщить модератору
 Re: Использовать ли NULL?  [new]
AndrF
Member

Откуда:
Сообщений: 2183
lex452
Давайте предположим что поле не индексированное, арифметических операций мне по нему не проводить, записей несколько десятков миллионов, допустим треть из них это пустое значение. У столбца тип данных tinyint. Будет ли выигрыш по свободному месту если использовать NULL вместо 0? Подобных столбцов в таблице несколько.


А просто подумать? Безотносительно с какой СУБД вы работаете чудес не бывает. Под данные 0..255 у вас используется байт (tinyint). И еще в записи надо хранить признак того что поле NULL. То есть в самом лучшем случае это будет 9 бит. Потому поле с допустимым NULL по определению не может занимать меньше места, а вот больше - вполне...
23 май 17, 10:09    [20503261]     Ответить | Цитировать Сообщить модератору
 Re: Использовать ли NULL?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
AndrF
lex452
Давайте предположим что поле не индексированное, арифметических операций мне по нему не проводить, записей несколько десятков миллионов, допустим треть из них это пустое значение. У столбца тип данных tinyint. Будет ли выигрыш по свободному месту если использовать NULL вместо 0? Подобных столбцов в таблице несколько.


А просто подумать? Безотносительно с какой СУБД вы работаете чудес не бывает. Под данные 0..255 у вас используется байт (tinyint). И еще в записи надо хранить признак того что поле NULL. То есть в самом лучшем случае это будет 9 бит. Потому поле с допустимым NULL по определению не может занимать меньше места, а вот больше - вполне...

не порите чушь, она тут и так избита
23 май 17, 10:13    [20503271]     Ответить | Цитировать Сообщить модератору
 Re: Использовать ли NULL?  [new]
AndrF
Member

Откуда:
Сообщений: 2183
[quot TaPaK]
AndrF
пропущено...
не порите чушь, она тут и так избита


Ну можете считать что признак того что поле является NULL или NOT NULL хранится в астрале. Лично я не против.
23 май 17, 10:21    [20503302]     Ответить | Цитировать Сообщить модератору
 Re: Использовать ли NULL?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
[quot AndrF]
TaPaK
пропущено...


Ну можете считать что признак того что поле является NULL или NOT NULL хранится в астрале. Лично я не против.

лично вы ничего не знаете о фиксированных типах данных
23 май 17, 10:22    [20503307]     Ответить | Цитировать Сообщить модератору
 Re: Использовать ли NULL?  [new]
aleksrov
Member

Откуда:
Сообщений: 948
AndrF,

https://www.sqlskills.com/blogs/paul/misconceptions-around-null-bitmap-size/
Как раз об этом.
23 май 17, 10:25    [20503311]     Ответить | Цитировать Сообщить модератору
 Re: Использовать ли NULL?  [new]
AndrF
Member

Откуда:
Сообщений: 2183
aleksrov
AndrF,
Как раз об этом.


Так я и говорил - чудес не бывает - минимум 9 бит на поле с NULL, как я и говорил. Сколько занимает поле NOT NULL - зависит уже от конкретной СУБД - его размера я и не называл. Но по вашей ссылке - все те же 9 байт. То есть экономии в MS SQL от того что для поля выставлен признак NOT NULL не будет. Что не так?
23 май 17, 11:08    [20503451]     Ответить | Цитировать Сообщить модератору
 Re: Использовать ли NULL?  [new]
o-0
Guest
то не так, что через пост читаете.
не будет занимать место вообще варчарная колонка с наллами,
если это *последняя* колонка
23 май 17, 11:18    [20503488]     Ответить | Цитировать Сообщить модератору
 Re: Использовать ли NULL?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
o-0
то не так, что через пост читаете.
не будет занимать место вообще варчарная колонка с наллами,
если это *последняя* колонка

угу, всё так для varcahar 0 в конце. Про какие 9 байт минимум для int упарывается оратор не ясно
23 май 17, 11:49    [20503668]     Ответить | Цитировать Сообщить модератору
 Re: Использовать ли NULL?  [new]
o-o
Guest
фигасебе у меня ник перекосило. неужели это я?
23 май 17, 11:55    [20503701]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить