Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
lex452 Member Откуда: Сообщений: 588 |
Есть таблица в которой в столбце возможны лишь значения 1,2,3. Задался вопросом, когда для этого столбца нет значения, что лучше использовать значение 0 или NULL. В дальнейшем по этому полю будет строиться индекс с фильтром is not null или !=0. Вопрос в том, будет ли выигрыш при запросе по этому полю и по занимаемому месту если использовать null вместо 0. Объемы данных несколько десятков миллионов. В одних источниках пишут что для фиксированных типов null и любое другое значение места занимают одинаково. Подскажите стоит ли использовать значение null и даст ли это уменьшение занимаемого места данными и повышение производительности при запросах? |
21 май 17, 23:21 [20499910] Ответить | Цитировать Сообщить модератору |
мегамозг Member Откуда: Екатеринбург Сообщений: 71 |
А какой смысл строить индекс по полю с 3 возможными значениями? |
||
22 май 17, 07:52 [20500157] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
roundabout Member Откуда: Сообщений: 13 |
0 и NULL разные вещи, на пример на 0 делить нельзя, на NULL можно. NULL никогда случайно не попадёт не в один диапазон <0 или >=0. Мое мнение NULL можно и нужно использовать, но только там где действительно ничего нет. |
22 май 17, 10:17 [20500469] Ответить | Цитировать Сообщить модератору |
Akina Member Откуда: Зеленоград, Москва, Россия Сообщений: 20974 |
|
||
22 май 17, 10:21 [20500484] Ответить | Цитировать Сообщить модератору |
lex452 Member Откуда: Сообщений: 588 |
Давайте предположим что поле не индексированное, арифметических операций мне по нему не проводить, записей несколько десятков миллионов, допустим треть из них это пустое значение. У столбца тип данных tinyint. Будет ли выигрыш по свободному месту если использовать NULL вместо 0? Подобных столбцов в таблице несколько. |
22 май 17, 15:59 [20501718] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
int фиксированный тип, ответ - нет если действительно 30% пустых то SPARSE NULL |
||
22 май 17, 16:06 [20501752] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
хотя нет... для int от 64% |
22 май 17, 16:07 [20501755] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
а у вас tinyint :) 86% |
22 май 17, 16:07 [20501757] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
выигрыш по месту будет при использовании NULL и variable-length типе, например varchar(1). колонка(и) с предполагаемыми NULL-ами должна быть последней. потому что если тип variable-length, то NULL не хранится, но зато всегда присутствует column offset, и это 2 байта. исключение: когда NULL это последняя колонка (или последние n колонок) только в этом случае не будет и column offset-а |
||
22 май 17, 16:15 [20501783] Ответить | Цитировать Сообщить модератору |
lex452 Member Откуда: Сообщений: 588 |
Вот такой ответ вполне подходит, спасибо. |
||
22 май 17, 21:45 [20502631] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37155 |
Для "объемы данных несколько десятков миллионов" вы вообще не там ищите способы ускорения и экономии. |
22 май 17, 22:21 [20502695] Ответить | Цитировать Сообщить модератору |
lex452 Member Откуда: Сообщений: 588 |
Гавриленко Сергей Алексеевич, Дайте совет где искать, может я чего то не понимаю. И мои объемы это много или в ваших словах есть сарказм? |
22 май 17, 22:32 [20502720] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37155 |
Или у вас тормозит что-то? |
||
22 май 17, 22:39 [20502738] Ответить | Цитировать Сообщить модератору |
lex452 Member Откуда: Сообщений: 588 |
Гавриленко Сергей Алексеевич, Самообразование тоже, не хочется доводить чтобы тормозило. Просто баз таких много и свободное место заканчивается, вот и ищу способы оптимизации и экономии. |
22 май 17, 22:43 [20502745] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
AndrF Member Откуда: Сообщений: 2194 |
А просто подумать? Безотносительно с какой СУБД вы работаете чудес не бывает. Под данные 0..255 у вас используется байт (tinyint). И еще в записи надо хранить признак того что поле NULL. То есть в самом лучшем случае это будет 9 бит. Потому поле с допустимым NULL по определению не может занимать меньше места, а вот больше - вполне... |
||
23 май 17, 10:09 [20503261] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
не порите чушь, она тут и так избита |
||||
23 май 17, 10:13 [20503271] Ответить | Цитировать Сообщить модератору |
AndrF Member Откуда: Сообщений: 2194 |
[quot TaPaK]
Ну можете считать что признак того что поле является NULL или NOT NULL хранится в астрале. Лично я не против. |
||
23 май 17, 10:21 [20503302] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
[quot AndrF]
лично вы ничего не знаете о фиксированных типах данных |
||
23 май 17, 10:22 [20503307] Ответить | Цитировать Сообщить модератору |
aleksrov Member Откуда: Сообщений: 948 |
AndrF, https://www.sqlskills.com/blogs/paul/misconceptions-around-null-bitmap-size/ Как раз об этом. |
23 май 17, 10:25 [20503311] Ответить | Цитировать Сообщить модератору |
AndrF Member Откуда: Сообщений: 2194 |
Так я и говорил - чудес не бывает - минимум 9 бит на поле с NULL, как я и говорил. Сколько занимает поле NOT NULL - зависит уже от конкретной СУБД - его размера я и не называл. Но по вашей ссылке - все те же 9 байт. То есть экономии в MS SQL от того что для поля выставлен признак NOT NULL не будет. Что не так? |
||
23 май 17, 11:08 [20503451] Ответить | Цитировать Сообщить модератору |
o-0
Guest |
то не так, что через пост читаете. не будет занимать место вообще варчарная колонка с наллами, если это *последняя* колонка |
23 май 17, 11:18 [20503488] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
угу, всё так для varcahar 0 в конце. Про какие 9 байт минимум для int упарывается оратор не ясно |
||
23 май 17, 11:49 [20503668] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
фигасебе у меня ник перекосило. неужели это я? ![]() |
23 май 17, 11:55 [20503701] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Все форумы / Microsoft SQL Server | ![]() |