powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Когда в ms sql появится свой mediumint ?
25 сообщений из 30, страница 1 из 2
Когда в ms sql появится свой mediumint ?
    #40075195
Кесарь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задумался тут над вопросами реализации модели ВЕРО и плавно перешёл (через избыточность ссылочных полей в центральной таблице объектов) к вопросу о недостаточности целочисленных типов в ms sql.

Ну что это в самом деле? Есть int, есть bigint. Разница между ними 4 байта и 4 294 967 раз. Ничего себе разгон! Есть smallint, есть int. Разница между ними уже не такая огромная, "всего" 2 байта и 65000 с лишним раз.

И в том, и в другом случае это слишком большие интервалы.

Не знаю как там для хранения каких-то вещественных значений (кол-во деталей в штуках, например), но для внутренних целей БД это слишком малый набор вариантов.

Парадокс, люди занимавшиеся созданием СУБД подумали о собссно ссылочной структуре в последнюю очередь. Чем они руководствовались, понять трудно. Однако очевидно, что размер хранения целых чисел в 1, 2, 4 и 8 байтов продиктован "красотой" этого ряда (всё как любят тру программисты вышедшие из математиков, всё это степени числа 2), но никак не практическими задачами.

Первейшая же задача реляционной БД это целостность и непротиворечивость, для чего нужны указатели и ссылки. Т.е. айдишники и ключи по ним. Потому как главное не положить данные в БД, а извлечь их потом.

Вот под это и нужно затачивать типы целочисленных данных. Потому как в ПЕРВУЮ очередь это вовсе не типы для хранения кол-ва мороженного на складе молокозавода. А типы для хранения номеров строк в таблицах.


Даже удивительно, что на это никто из создателей не обратил внимание, ведь даже термин реляционная идёт впереди термина база данных. Потому как реляционность важнее "базоданности".

(А вот в других РСУБД об этом подумали, хотя тоже вариант там дополнительный только один: медиуминт в MySQL)

Я полагаю, что типы целочисленных данных должны идти просто с шагом в 1 байт, и кому нужно, тот сам подберёт себе нужный диапазон.

Но сильнее всего конечно нужен медиуминт, потому как именно в этом диапазоне располагается значительная часть бизнес-задач, назовём это так. Ну скажем кол-во типов объектов ещё может дойти до десятков тысяч (2 байта), но вряд ли достигнет верхнего порога в 8 с лишним миллионов (3 байта).

Для примера есть таблица на 10 млрд записей. В ней есть поле с ID некой сущности. Сущностей не так много, но ставить smallint несколько опрометчиво. Мало ли как дело пойдёт? И назначают обычный инт, т.е. 4 байта.

Если же у нас был бы тип медиуминт, то экономия составила бы 10 млрд байт, т.е. 9.3 Гб. Оно вроде как по нынешним временам и не так много, но таблица такая не одна, помимо хранения самой таблицы на дисках, есть ещё чтение, запись, оперативка, tempdb и проталкивание данных через сети и системы обмена. В общем прилично набегает.

P.S. Более того! Sql server вообще-то умеет (умеет, когда захочет, что называется) хранить данные побитово. И ничто не мешает сделать типы данных с размером в 1.5 и 2.5 байт. Т.е. в 12 и 20 бит. Если такие типы данных ограничить только положительными значениями, то они были бы очень хороши для идентификаторов справочников (12 бит = 0 - 4095) или иных бизнес-сущностей (20 бит = 0 - 1 048 575).
...
Рейтинг: 0 / 0
Когда в ms sql появится свой mediumint ?
    #40075198
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Учитывая, что отрицательная часть интов применяется редко, давайте еще unsigned int сделаем, ага.
Есть binary/varbinary , закроет большинство сценариев хранения трехбайтовых интов.
...
Рейтинг: 0 / 0
Когда в ms sql появится свой mediumint ?
    #40075199
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кесарь
Однако очевидно, что размер хранения целых чисел в 1, 2, 4 и 8 байтов продиктован "красотой" этого ряда (всё как любят тру программисты вышедшие из математиков, всё это степени числа 2), но никак не практическими задачами.

Ну да... а архитектура процессоров и их типы данных тут, конечно, не при делах... а что, предложи, пусть Intel забацает процессорные регистры из трёх байтов.
...
Рейтинг: 0 / 0
Когда в ms sql появится свой mediumint ?
    #40075202
Кесарь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей Алексеевич
Учитывая, что отрицательная часть интов применяется редко, давайте еще unsigned int сделаем, ага.
Есть binary/varbinary , закроет большинство сценариев хранения трехбайтовых интов.


1. "unsigned int" Было бы неплохо, хотя вот именно это не так остро нужно. Надо брать у конкурентов удачные решения.

2. "binary/varbinary". А поиск так же быстро будет работать? Это риторический вопрос.

"по int сравнение будет быстрее, потому что для него есть поддержка процессора: сравнение двух целых чисел - это одна инструкция процессора."
...
Рейтинг: 0 / 0
Когда в ms sql появится свой mediumint ?
    #40075204
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кесарь
.

Если же у нас был бы тип медиуминт, то экономия составила бы 10 млрд байт, т.е. 9.3 Гб. Оно вроде как по нынешним временам и не так много, но таблица такая не одна, помимо хранения самой таблицы на дисках, есть ещё чтение, запись, оперативка, tempdb и проталкивание данных через сети и системы обмена. В общем прилично набегает.

P.S. Более того! Sql server вообще-то умеет (умеет, когда захочет, что называется) хранить данные побитово. И ничто не мешает сделать типы данных с размером в 1.5 и 2.5 байт. Т.е. в 12 и 20 бит. Если такие типы данных ограничить только положительными значениями, то они были бы очень хороши для идентификаторов справочников (12 бит = 0 - 4095) или иных бизнес-сущностей (20 бит = 0 - 1 048 575).

Гм, вот прецеденты, когда int не хватало - были. И был геморрой по переделке этого в бигинт.
А вот шобы bigint мешался "из-за размера" - такого не припомню.
"9.3 Гб" на таблице, содержащей десяток полей - это ниочем.
...
Рейтинг: 0 / 0
Когда в ms sql появится свой mediumint ?
    #40075206
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кесарь2. "binary/varbinary". А поиск так же быстро будет работать? Это риторический вопрос.На большом кол-ве данных -- а ведь именно на них экономия байтов имеет смысл -- вы скорее упретесь в диски/память, чем в проц, и не увидите этих накладных расходов.
...
Рейтинг: 0 / 0
Когда в ms sql появится свой mediumint ?
    #40075208
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И, кстати, да, компрессию уже давно завезли:

https://docs.microsoft.com/ru-ru/sql/relational-databases/data-compression/row-compression-implementation?view=sql-server-ver15bigint Да Использует минимально необходимое число байт. Например, если значение может храниться в 1 байте, то для его хранения будет использоваться всего 1 байт.
...
Рейтинг: 0 / 0
Когда в ms sql появится свой mediumint ?
    #40075209
Кесарь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina
Ну да... а архитектура процессоров и их типы данных тут, конечно, не при делах... а что, предложи, пусть Intel забацает процессорные регистры из трёх байтов.


Akina,

исходя из этой логики:

1. Непонятно, как получилось, что есть типы данных на 1 и 2 байта. Раз у регистра строго 4 (теперь уже 8). Если регистр 4 (8) байта, то можно иметь от 1 до 4 байт (до 8). Типы данных на 1 и 2 байта есть, почему нельзя иметь 3? Вы придумываете сложность на ровном месте.

2. Поиск в MySQL по медиуминту должен быть не быстрее, чем по бигинту. Это так?
...
Рейтинг: 0 / 0
Когда в ms sql появится свой mediumint ?
    #40075212
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кесарь
Поиск в MySQL по медиуминту должен быть не быстрее, чем по бигинту. Это так?
Модератор: У меня начинает появляться желание снести тему в Сравнение СУБД. Давайте или в расках скуля оставаться, или туда поедете.
...
Рейтинг: 0 / 0
Когда в ms sql появится свой mediumint ?
    #40075215
Кесарь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей Алексеевич
И, кстати, да, компрессию уже давно завезли:

https://docs.microsoft.com/ru-ru/sql/relational-databases/data-compression/row-compression-implementation?view=sql-server-ver15bigint Да Использует минимально необходимое число байт. Например, если значение может храниться в 1 байте, то для его хранения будет использоваться всего 1 байт.


Они молодцы, что развиваются. Плохо, что они реализуют правильные вещи через неявные механизмы. С кучей особенностей, ограничений и влияний. Я не против сжатия, но прямой путь тоже неплохо бы реализовать.

Ну вот например:

"Операции массового импорта и экспорта
При экспорте данных, даже в собственном формате, данные выводятся в распакованном формате строк. Поэтому размер экспортированного файла данных может значительно превысить размер исходных данных.
При импорте данных, если для целевой таблицы было включено сжатие, данные будут преобразованы подсистемой хранилища в сжатый формат строк. По сравнению с импортом данных в распакованную таблицу такой импорт может потребовать больше ресурсов ЦП.
Если массовый импорт данных производится в кучу с включенным сжатием страниц, то при вставке данных операция массового импорта попытается применить к ним сжатие страниц."


Я про что и говорил: БД не в вакууме вертится, а в среде. И в этой среде пересылка данных туда сюда тоже требует затрат. Уменьшение напрямую размера данных уменьшает затраты, а сжатие данных в самой БД нет.
...
Рейтинг: 0 / 0
Когда в ms sql появится свой mediumint ?
    #40075221
Кесарь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
Гм, вот прецеденты, когда int не хватало - были. И был геморрой по переделке этого в бигинт.


Вы так возражаете? Это ж подтверждение: был бы медиуминт, вы бы его заложили сразу и ничего переделывать не пришлось бы!


А вот шобы bigint мешался "из-за размера" - такого не припомню.
"9.3 Гб" на таблице, содержащей десяток полей - это ниочем.

Речь не про экономию дискового пространства, хотя и это важно. А про скорость работы системы в целом.
...
Рейтинг: 0 / 0
Когда в ms sql появится свой mediumint ?
    #40075229
Кесарь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кесарь
aleks222
Гм, вот прецеденты, когда int не хватало - были. И был геморрой по переделке этого в бигинт.


Вы так возражаете? Это ж подтверждение: был бы медиуминт, вы бы его заложили сразу и ничего переделывать не пришлось бы!

Речь не про экономию дискового пространства, хотя и это важно. А про скорость работы системы в целом.


Извиняюсь, имелся в виду медиуминт2, который между инт и бигинт, а не между смолинт и инт.


А вообще по хорошему всех этих бигинтов и смолинтов быть не должно, а должны быть инты:

int1, int2, ..., int8 где число означает кол-во байт.
...
Рейтинг: 0 / 0
Когда в ms sql появится свой mediumint ?
    #40075236
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скорее всего, дело в скорости обработки и наборе команд интеловских процессоров. Судя по основанию 2 получить указатель на новое значение можно операцией сдвига, а это очень быстро. Бытовые рассуждения здесь не помогут, надо знать процессорную механику.
...
Рейтинг: 0 / 0
Когда в ms sql появится свой mediumint ?
    #40075239
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рассуждать про процессорные команды, не зная, что и как делает МС -- это супер-наивно.

Доводы про размер? Они понятны -- это экономия диска и памяти.
Доводы про скорость процессорной обработки int vs binary? Смех какой-то.
...
Рейтинг: 0 / 0
Когда в ms sql появится свой mediumint ?
    #40075246
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Главный вопрос - а оно надо? Оракл вообще не имеет целочисленных типов и прекрасно себя чувствует.
...
Рейтинг: 0 / 0
Когда в ms sql появится свой mediumint ?
    #40075247
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей Алексеевич,

Доводы про скорость процессорной обработки int vs binary? Смех какой-то.

Поему - смех? Когда писали ядро этой системы?
...
Рейтинг: 0 / 0
Когда в ms sql появится свой mediumint ?
    #40075253
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
Гавриленко Сергей Алексеевич,

Доводы про скорость процессорной обработки int vs binary? Смех какой-то.


Поему - смех? Когда писали ядро этой системы?Да пофиг "когда". Не пофиг - "как".
Поэтому и смех, что вообще никто не знает, как сделан скуль. Может все типы побайтово и так сравниваются. И разницы между int и varbinary (8) нет в принципе.
...
Рейтинг: 0 / 0
Когда в ms sql появится свой mediumint ?
    #40075254
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кесарь
И в том, и в другом случае это слишком большие интервалы.
И даже это программисты не используют. Не делают tinyint там, где его точно хватит. Почему? Потому что нет гарантии, что хватит, потому что экономия этих 9 гб выйдет компании в такие затраты, что она может обеспечить себя всю топовыми СХД на 100 лет.
Поэтому нужен не Int3 или Int7, а VarInt, который бы занимал подходящее количество бит под лежащее там значение.
Записали туда 127, выделилось 8 бит, прибавили 1, опа, уже под поле в этой конкретной записи выделено 9 бит.
...
Рейтинг: 0 / 0
Когда в ms sql появится свой mediumint ?
    #40075264
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
Кесарь
И в том, и в другом случае это слишком большие интервалы.
И даже это программисты не используют. Не делают tinyint там, где его точно хватит. Почему? Потому что нет гарантии, что хватит, потому что экономия этих 9 гб выйдет компании в такие затраты, что она может обеспечить себя всю топовыми СХД на 100 лет.
Поэтому нужен не Int3 или Int7, а VarInt, который бы занимал подходящее количество бит под лежащее там значение.
Записали туда 127, выделилось 8 бит, прибавили 1, опа, уже под поле в этой конкретной записи выделено 9 бит.
Лепить bigint везде на случай "как бы чего не вышло" -- так себе идея.
Я внизу в спойлере накидал запрос на оценку, что будет, если вместо не-bigint делать всегда bigint. На одной из основных баз получается оверхед 25 TB. (Не уверен на 100%, что не ошибся).

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
select
    a.data_type
    , overhead_gb = sum ( rows.rows * cast (r.multiplier as bigint) ) / 1024. / 1024. / 1024.
from        INFORMATION_SCHEMA.COLUMNS a
cross apply (
    select
        multiplier = case a.DATA_TYPE
            when 'int'      then 2
            when 'smallint' then 4
            when 'tinyint'  then 8
        end
        , object_id = object_id( quotename( a.TABLE_SCHEMA ) + '.' + quotename( a.table_name ) )
) r
cross apply (
    select
        c.object_id
        , i.index_id
    from         sys.columns         c
    inner join   sys.index_columns   ic on 
        ic.object_id        = c.object_id
    inner join   sys.indexes         i  on 
        ic.object_id = i.object_id
        and i.index_id not in (0, 1)
    where
        c.object_id = r.object_id
        and c.name  = a.COLUMN_NAME
    union all
    select
        c.object_id
        , i.index_id
    from        sys.columns         c
    left join   sys.indexes         i  on 
        c.object_id = i.object_id
        and i.index_id in (0, 1)
    where
        c.object_id = r.object_id
        and c.name  = a.COLUMN_NAME
) ic
cross apply (
    select
        rows = sum( p.rows )
    from    sys.partitions p
    where
        p.object_id     = ic.object_id
        and p.index_id  = ic.index_id
) rows
where
    a.DATA_TYPE in ( 'int', 'smallint', 'tinyint' )
    and objectproperty( r.object_id, 'IsMsShipped' ) = 0
group by
    a.data_type
order by
    overhead_gb desc

...
Рейтинг: 0 / 0
Когда в ms sql появится свой mediumint ?
    #40075286
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей Алексеевич,

Да пофиг "когда". Не пофиг - "как".

Именно, "как" тогда и "как" сейчас - очень сильно отличается. Тогда покомандно анализировали работу компилятора. Кто сейчас этим будет заниматься?
...
Рейтинг: 0 / 0
Когда в ms sql появится свой mediumint ?
    #40075305
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей Алексеевич,

Ошибся чуть. Надо так
Код: sql
1.
2.
3.
4.
        multiplier = case a.DATA_TYPE
            when 'int'      then 4
            when 'smallint' then 6
            when 'tinyint'  then 7


Сколько каждый тип экономит лишних вместо 8-байтового bigint

и это не оверхед, а наоборот - экономия.

ЗЫ. топик мается бездельем
...
Рейтинг: 0 / 0
Когда в ms sql появится свой mediumint ?
    #40075309
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl,

Сглсн. Поправил. Пересчитал. Плюс-минус те же "сырые" 25 Тб.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
select
    a.data_type
    , overhead_gb = sum ( rows.rows * cast (8 - r.size as bigint) ) / 1024. / 1024. / 1024.
from        INFORMATION_SCHEMA.COLUMNS a
cross apply (
    select
        size = case a.DATA_TYPE
            when 'int'      then 4
            when 'smallint' then 2
            when 'tinyint'  then 1
        end
        , object_id = object_id( quotename( a.TABLE_SCHEMA ) + '.' + quotename( a.table_name ) )
) r
cross apply (
    select
        c.object_id
        , i.index_id
    from         sys.columns         c
    inner join   sys.index_columns   ic on 
        ic.object_id        = c.object_id
    inner join   sys.indexes         i  on 
        ic.object_id = i.object_id
        and i.index_id not in (0, 1)
    where
        c.object_id = r.object_id
        and c.name  = a.COLUMN_NAME
    union all
    select
        c.object_id
        , i.index_id
    from        sys.columns         c
    left join   sys.indexes         i  on 
        c.object_id = i.object_id
        and i.index_id in (0, 1)
    where
        c.object_id = r.object_id
        and c.name  = a.COLUMN_NAME
) ic
cross apply (
    select
        rows = sum( p.rows )
    from    sys.partitions p
    where
        p.object_id     = ic.object_id
        and p.index_id  = ic.index_id
) rows
where
    a.DATA_TYPE in ( 'int', 'smallint', 'tinyint' )
    and objectproperty( r.object_id, 'IsMsShipped' ) = 0
group by
    a.data_type
order by
    overhead_gb desc

...
Рейтинг: 0 / 0
Когда в ms sql появится свой mediumint ?
    #40075356
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помнится, я когда-то писал программу, которая рекомендует замену размеров колонки, анализируя содержимое, в том числе с заменой типов и not null.
...
Рейтинг: 0 / 0
Когда в ms sql появится свой mediumint ?
    #40075366
Кесарь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей Алексеевич

Я внизу в спойлере накидал запрос на оценку, что будет, если вместо не-bigint делать всегда bigint.


Отличный запрос! Мне понравилось.


На одной из основных баз получается оверхед 25 TB. (Не уверен на 100%, что не ошибся).

Вооот! А это помимо дисков и всё остальное окружение, которое должно через себя пропустить все эти лишние объёмы.
...
Рейтинг: 0 / 0
Когда в ms sql появится свой mediumint ?
    #40075372
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей Алексеевич,

а в процентном соотношении какой over? У меня на базе 0.3%, база около 1 Тб.
...
Рейтинг: 0 / 0
25 сообщений из 30, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Когда в ms sql появится свой mediumint ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]