Есть ли причина для числового, а не для int в T-SQL?

Зачем кому-то использовать числовой (12, 0) тип данных для столбца простого целочисленного идентификатора? Если у вас есть причина, почему это лучше, чем int или bigint, я хотел бы ее услышать.

Мы не делаем никаких математических расчетов в этом столбце, это просто идентификатор, используемый для связывания внешнего ключа.

Я составляю список ошибок программирования и проблем с производительностью продукта и хочу быть уверенным, что они этого не сделали по какой-то логической причине. Если вы перейдете по этой ссылке: http://msdn.microsoft.com/en-us/library/ms187746.aspx

... вы можете видеть, что числовой (12, 0) использует 9 байтов памяти и ограничен 12 цифрами, всего 2 триллиона чисел, если вы включаете отрицательные числа. ПОЧЕМУ человек будет использовать это, если он может использовать bigint и получить в 10 миллионов раз больше чисел с на один байт меньше памяти. Кроме того, поскольку он используется в качестве идентификатора продукта, 4 миллиардов чисел стандартного int было бы более чем достаточно.

Так что, прежде чем я возьму факелы и вилы, скажите мне, что они собираются сказать в свою защиту?

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

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
17
0
28 127
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

В вашем примере я не могу придумать никакой логической причины, по которой вы бы не использовали INT. Я знаю, что, вероятно, есть причины для другого использования чисел, но не в этом случае.

По данным: http://doc.ddart.net/mssql/sql70/da-db_1.htm

decimal

Fixed precision and scale numeric data from -10^38 -1 through 10^38 -1.

numeric

A synonym for decimal.

int

Integer (whole number) data from -2^31 (-2,147,483,648) through 2^31 - 1 (2,147,483,647).

Невозможно узнать, есть ли причина для использования десятичных чисел, поскольку у нас нет кода, на который можно было бы смотреть.

Странно, что ints относятся к "целым числам", когда им разрешено быть отрицательными.

recursive 14.01.2009 00:15

Отрицательные числа - это целые числа, у них нет дробной части. По большинству определений они не являются «счетными числами», но являются целыми.

Jasmine 14.01.2009 00:24

Термин целое число используется различными авторами для обозначения натурального числа, которое может быть либо: неотрицательными целыми числами (0, 1, 2, 3, ...), либо положительными целыми числами (1, 2, 3, ...)

GEOCHET 14.01.2009 00:47

Есть много причин использовать числовые данные - например, финансовые данные и другие данные, которые должны быть точными до определенных десятичных знаков. Однако для приведенного выше примера подойдет простой int.

Возможно, работают неряшливые программисты, не умеющие проектировать базу данных?

В некоторых базах данных использование десятичной дроби (10,0) создает упакованное поле, которое занимает меньше места. Я знаю, что в моей работе есть много таблиц, в которых это используется. Вероятно, здесь у них были такие же мысли, но вы просмотрели документацию и доказали, что это неверно. Скорее всего, я бы сказал, что это будет сводиться к случаю, «так мы всегда это делали, потому что кто-то однажды сказал, что это лучше».

Прежде чем вы относитесь к вещам слишком серьезно, каковы требования к хранилищу данных для каждой строки или набора строк для этого элемента?

Ваше наблюдение верное, но вы, вероятно, не захотите представлять его слишком сильно, если, например, вы сокращаете объем хранилища с 5000 до 4090 байтов.

Вы не хотите подорвать доверие к себе, поднимая этот вопрос и заставляя их указывать на то, что любая измеримая экономия ничтожна. («Конечно, многие из наших менее опытных сотрудников также совершают ту же ошибку».)

Можете ли вы заполнить эти пробелы?

with the data type change, we use
    ____ bytes of disk space instead of ____
    ____ ms per query instead of ____
    ____ network bandwidth instead of ____
    ____ network latency instead of ____

Это то, что вселяет в вас доверие.

Поскольку этот идентификационный код копируется во многие таблицы, используется в запросах API и используется для объединений, это не просто вопрос сохранения одного байта на строку - это вопрос сохранения данных в индексах, оптимизации объединений, уменьшения сетевых накладных расходов, так далее...

Jasmine 14.01.2009 00:23

Точно. Определите это количественно, и вы получите веские аргументы в пользу своего решения. возражения, которые я сделал, были лишь примерами возражений, которые вы могли услышать и на которые должны быть готовы ответить.

Mark Harrison 13.08.2009 01:34

Возможно, они проводят много времени в MS Access и часто видят «Число» и просто прикидывают, это число, почему бы не использовать числовое?

Судя по вашим выводам, это не похоже на то, что они эксперты по оптимизации, и они просто не знали. Мне интересно, использовали ли они инструменты генерации схем и слишком ли полагались на них.

Интересно, насколько эффективен индекс для десятичного значения (даже если установлен масштаб 0) для первичного ключа по сравнению с чистым целочисленным значением.

Как сказал Марк Х., помимо фактора индексации, этот конкретный сценарий, скорее всего, не ТАКОЕ увеличивает базу данных, но если вы ищете боеприпасы, я думаю, вы действительно нашли некоторые, чтобы их принизить.

У меня есть много ошибок, на которые я уверен. Это просто стало таким сюрпризом, что это одна из тех вещей, «у которых должна быть причина». I.E. это настолько странно, что должно быть сделано специально.

Jasmine 14.01.2009 00:37

Сколько лет этому приложению, которое вы изучаете?

До SQL Server 2000 не было bigint. Может быть, это просто что-то, что доставлялось от выпуска к выпуску в течение многих лет без изменений, или схема базы данных была скопирована из приложения, которое было таким старым?!?

Это новинка со времен SQL 2000. Однако возможно, что база данных основана на какой-то более старой конструкции, но это будет означать, что они продали нам что-то не то, что они сказали.

Jasmine 14.01.2009 01:58
Ответ принят как подходящий

Может, они привыкли работать с Oracle?

Все числовые типы, включая целые числа, нормализованы до стандартного единого представления для всех платформ.

Бум идет динамит :) Очевидно, старая версия этой базы данных была Oracle.

Jasmine 15.01.2009 20:56

В вашей цитате десятичная дробь показывает точность от 1 до 9 при использовании 5 байтов. Ваш столбец, по-видимому, имеет 12,0 - используя 4 байта памяти - то же самое, что и целое число.

Более того, INT, тип данных может достигать степени 31: От -2 ^ 31 (-2,147,483,648) до 2 ^ 31-1 (2,147,483,647)

В то время как десятичная дробь намного больше 38: - от 10 ^ 38 +1 до 10 ^ 38 - 1

Таким образом, создатель программного обеспечения фактически предоставил больше при использовании того же объема дискового пространства.

Теперь, когда основы разложены, создатель программного обеспечения фактически ограничился всего 12 числами или 123 456 789 012 (просто пример для владельцев мест, а не максимальное число). Если бы они использовали INT, они не смогли бы масштабировать этот столбец - он увеличился бы до 31 цифры. Возможно, есть коммерческая причина ограничить этот столбец и связанные столбцы 12 цифрами.

INT - это INT, а DECIMAL - скаляр.

Надеюсь это поможет.

PS: Аргумент целого числа: А) Целые числа равны 0 .. бесконечность. Б) Счетные (натуральные) числа равны 1 ... бесконечность. C) Целые числа - бесконечность (отрицательная) .. бесконечность (положительная) Г) Я бы ни за что не цитировал WikiANYTHING. Давай, используйте настоящий источник! Также может быть http://MyPersonalMathCite.com

? Согласно документации Microsoft по t-sql (ссылка предоставлена ​​исходным плакатом), точность 12,0 занимает 9 байтов, а не 4.

pmdci 09.10.2019 11:50

Другие вопросы по теме