|
Когда в ms sql появится свой mediumint ?
|
|||
---|---|---|---|
#18+
Задумался тут над вопросами реализации модели ВЕРО и плавно перешёл (через избыточность ссылочных полей в центральной таблице объектов) к вопросу о недостаточности целочисленных типов в 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). ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2021, 18:36 |
|
Когда в ms sql появится свой mediumint ?
|
|||
---|---|---|---|
#18+
Учитывая, что отрицательная часть интов применяется редко, давайте еще unsigned int сделаем, ага. Есть binary/varbinary , закроет большинство сценариев хранения трехбайтовых интов. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2021, 18:40 |
|
Когда в ms sql появится свой mediumint ?
|
|||
---|---|---|---|
#18+
Кесарь Однако очевидно, что размер хранения целых чисел в 1, 2, 4 и 8 байтов продиктован "красотой" этого ряда (всё как любят тру программисты вышедшие из математиков, всё это степени числа 2), но никак не практическими задачами. Ну да... а архитектура процессоров и их типы данных тут, конечно, не при делах... а что, предложи, пусть Intel забацает процессорные регистры из трёх байтов. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2021, 18:46 |
|
Когда в ms sql появится свой mediumint ?
|
|||
---|---|---|---|
#18+
Гавриленко Сергей Алексеевич Учитывая, что отрицательная часть интов применяется редко, давайте еще unsigned int сделаем, ага. Есть binary/varbinary , закроет большинство сценариев хранения трехбайтовых интов. 1. "unsigned int" Было бы неплохо, хотя вот именно это не так остро нужно. Надо брать у конкурентов удачные решения. 2. "binary/varbinary". А поиск так же быстро будет работать? Это риторический вопрос. "по int сравнение будет быстрее, потому что для него есть поддержка процессора: сравнение двух целых чисел - это одна инструкция процессора." ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2021, 18:54 |
|
Когда в ms sql появится свой mediumint ?
|
|||
---|---|---|---|
#18+
Кесарь . Если же у нас был бы тип медиуминт, то экономия составила бы 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 Гб" на таблице, содержащей десяток полей - это ниочем. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2021, 18:56 |
|
Когда в ms sql появится свой mediumint ?
|
|||
---|---|---|---|
#18+
Кесарь2. "binary/varbinary". А поиск так же быстро будет работать? Это риторический вопрос.На большом кол-ве данных -- а ведь именно на них экономия байтов имеет смысл -- вы скорее упретесь в диски/память, чем в проц, и не увидите этих накладных расходов. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2021, 19:03 |
|
Когда в ms sql появится свой mediumint ?
|
|||
---|---|---|---|
#18+
И, кстати, да, компрессию уже давно завезли: https://docs.microsoft.com/ru-ru/sql/relational-databases/data-compression/row-compression-implementation?view=sql-server-ver15bigint Да Использует минимально необходимое число байт. Например, если значение может храниться в 1 байте, то для его хранения будет использоваться всего 1 байт. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2021, 19:06 |
|
Когда в ms sql появится свой mediumint ?
|
|||
---|---|---|---|
#18+
Akina Ну да... а архитектура процессоров и их типы данных тут, конечно, не при делах... а что, предложи, пусть Intel забацает процессорные регистры из трёх байтов. Akina, исходя из этой логики: 1. Непонятно, как получилось, что есть типы данных на 1 и 2 байта. Раз у регистра строго 4 (теперь уже 8). Если регистр 4 (8) байта, то можно иметь от 1 до 4 байт (до 8). Типы данных на 1 и 2 байта есть, почему нельзя иметь 3? Вы придумываете сложность на ровном месте. 2. Поиск в MySQL по медиуминту должен быть не быстрее, чем по бигинту. Это так? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2021, 19:08 |
|
Когда в ms sql появится свой mediumint ?
|
|||
---|---|---|---|
#18+
Кесарь Поиск в MySQL по медиуминту должен быть не быстрее, чем по бигинту. Это так? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2021, 19:12 |
|
Когда в ms sql появится свой mediumint ?
|
|||
---|---|---|---|
#18+
Гавриленко Сергей Алексеевич И, кстати, да, компрессию уже давно завезли: https://docs.microsoft.com/ru-ru/sql/relational-databases/data-compression/row-compression-implementation?view=sql-server-ver15bigint Да Использует минимально необходимое число байт. Например, если значение может храниться в 1 байте, то для его хранения будет использоваться всего 1 байт. Они молодцы, что развиваются. Плохо, что они реализуют правильные вещи через неявные механизмы. С кучей особенностей, ограничений и влияний. Я не против сжатия, но прямой путь тоже неплохо бы реализовать. Ну вот например: "Операции массового импорта и экспорта При экспорте данных, даже в собственном формате, данные выводятся в распакованном формате строк. Поэтому размер экспортированного файла данных может значительно превысить размер исходных данных. При импорте данных, если для целевой таблицы было включено сжатие, данные будут преобразованы подсистемой хранилища в сжатый формат строк. По сравнению с импортом данных в распакованную таблицу такой импорт может потребовать больше ресурсов ЦП. Если массовый импорт данных производится в кучу с включенным сжатием страниц, то при вставке данных операция массового импорта попытается применить к ним сжатие страниц." Я про что и говорил: БД не в вакууме вертится, а в среде. И в этой среде пересылка данных туда сюда тоже требует затрат. Уменьшение напрямую размера данных уменьшает затраты, а сжатие данных в самой БД нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2021, 19:22 |
|
Когда в ms sql появится свой mediumint ?
|
|||
---|---|---|---|
#18+
aleks222 Гм, вот прецеденты, когда int не хватало - были. И был геморрой по переделке этого в бигинт. Вы так возражаете? Это ж подтверждение: был бы медиуминт, вы бы его заложили сразу и ничего переделывать не пришлось бы! А вот шобы bigint мешался "из-за размера" - такого не припомню. "9.3 Гб" на таблице, содержащей десяток полей - это ниочем. Речь не про экономию дискового пространства, хотя и это важно. А про скорость работы системы в целом. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2021, 19:34 |
|
Когда в ms sql появится свой mediumint ?
|
|||
---|---|---|---|
#18+
Кесарь aleks222 Гм, вот прецеденты, когда int не хватало - были. И был геморрой по переделке этого в бигинт. Вы так возражаете? Это ж подтверждение: был бы медиуминт, вы бы его заложили сразу и ничего переделывать не пришлось бы! Речь не про экономию дискового пространства, хотя и это важно. А про скорость работы системы в целом. Извиняюсь, имелся в виду медиуминт2, который между инт и бигинт, а не между смолинт и инт. А вообще по хорошему всех этих бигинтов и смолинтов быть не должно, а должны быть инты: int1, int2, ..., int8 где число означает кол-во байт. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2021, 20:00 |
|
Когда в ms sql появится свой mediumint ?
|
|||
---|---|---|---|
#18+
Скорее всего, дело в скорости обработки и наборе команд интеловских процессоров. Судя по основанию 2 получить указатель на новое значение можно операцией сдвига, а это очень быстро. Бытовые рассуждения здесь не помогут, надо знать процессорную механику. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2021, 20:22 |
|
Когда в ms sql появится свой mediumint ?
|
|||
---|---|---|---|
#18+
Рассуждать про процессорные команды, не зная, что и как делает МС -- это супер-наивно. Доводы про размер? Они понятны -- это экономия диска и памяти. Доводы про скорость процессорной обработки int vs binary? Смех какой-то. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2021, 20:40 |
|
Когда в ms sql появится свой mediumint ?
|
|||
---|---|---|---|
#18+
Главный вопрос - а оно надо? Оракл вообще не имеет целочисленных типов и прекрасно себя чувствует. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2021, 21:32 |
|
Когда в ms sql появится свой mediumint ?
|
|||
---|---|---|---|
#18+
Гавриленко Сергей Алексеевич, Доводы про скорость процессорной обработки int vs binary? Смех какой-то. Поему - смех? Когда писали ядро этой системы? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2021, 21:34 |
|
Когда в ms sql появится свой mediumint ?
|
|||
---|---|---|---|
#18+
Владислав Колосов Гавриленко Сергей Алексеевич, Доводы про скорость процессорной обработки int vs binary? Смех какой-то. Поему - смех? Когда писали ядро этой системы?Да пофиг "когда". Не пофиг - "как". Поэтому и смех, что вообще никто не знает, как сделан скуль. Может все типы побайтово и так сравниваются. И разницы между int и varbinary (8) нет в принципе. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2021, 21:49 |
|
Когда в ms sql появится свой mediumint ?
|
|||
---|---|---|---|
#18+
Кесарь И в том, и в другом случае это слишком большие интервалы. Поэтому нужен не Int3 или Int7, а VarInt, который бы занимал подходящее количество бит под лежащее там значение. Записали туда 127, выделилось 8 бит, прибавили 1, опа, уже под поле в этой конкретной записи выделено 9 бит. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2021, 21:49 |
|
Когда в ms sql появится свой mediumint ?
|
|||
---|---|---|---|
#18+
alexeyvg Кесарь И в том, и в другом случае это слишком большие интервалы. Поэтому нужен не Int3 или Int7, а VarInt, который бы занимал подходящее количество бит под лежащее там значение. Записали туда 127, выделилось 8 бит, прибавили 1, опа, уже под поле в этой конкретной записи выделено 9 бит. Я внизу в спойлере накидал запрос на оценку, что будет, если вместо не-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.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2021, 22:32 |
|
Когда в ms sql появится свой mediumint ?
|
|||
---|---|---|---|
#18+
Гавриленко Сергей Алексеевич, Да пофиг "когда". Не пофиг - "как". Именно, "как" тогда и "как" сейчас - очень сильно отличается. Тогда покомандно анализировали работу компилятора. Кто сейчас этим будет заниматься? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2021, 00:55 |
|
Когда в ms sql появится свой mediumint ?
|
|||
---|---|---|---|
#18+
Гавриленко Сергей Алексеевич, Ошибся чуть. Надо так Код: sql 1. 2. 3. 4.
Сколько каждый тип экономит лишних вместо 8-байтового bigint и это не оверхед, а наоборот - экономия. ЗЫ. топик мается бездельем ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2021, 02:47 |
|
Когда в ms sql появится свой mediumint ?
|
|||
---|---|---|---|
#18+
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.
... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2021, 03:23 |
|
Когда в ms sql появится свой mediumint ?
|
|||
---|---|---|---|
#18+
Помнится, я когда-то писал программу, которая рекомендует замену размеров колонки, анализируя содержимое, в том числе с заменой типов и not null. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2021, 10:49 |
|
Когда в ms sql появится свой mediumint ?
|
|||
---|---|---|---|
#18+
Гавриленко Сергей Алексеевич Я внизу в спойлере накидал запрос на оценку, что будет, если вместо не-bigint делать всегда bigint. Отличный запрос! Мне понравилось. На одной из основных баз получается оверхед 25 TB. (Не уверен на 100%, что не ошибся). Вооот! А это помимо дисков и всё остальное окружение, которое должно через себя пропустить все эти лишние объёмы. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2021, 11:25 |
|
|
start [/forum/topic.php?fid=46&fpage=23&tid=1684640]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
36ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
others: | 12ms |
total: | 152ms |
0 / 0 |