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

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

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

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

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

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

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

Ответы [ 9 ]

14 голосов
/ 14 января 2009

Возможно, они привыкли работать с Oracle?

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

6 голосов
/ 14 января 2009

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

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

3 голосов
/ 14 января 2009

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

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

1 голос
/ 14 января 2009

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

Ваши наблюдения верны, но вы, вероятно, не хотите представлять их слишком сильно, например, если вы уменьшаете объем хранилища с 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 ____

Это та вещь, которая придаст вам авторитет.

1 голос
/ 14 января 2009

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

0 голосов
/ 26 июня 2012

В вашей цитате десятичная дробь показывает точность 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 .. бесконечность B) Подсчет (натуральных) чисел равен 1..infinity C) Целые числа бесконечность (отрицательный) .. бесконечность (положительный) D) Я бы ни за что не цитировал WikiANYTHING. Давай, используй реальный источник! Также может быть http://MyPersonalMathCite.com

0 голосов
/ 14 января 2009

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

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

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

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

0 голосов
/ 14 января 2009

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

0 голосов
/ 14 января 2009

Согласно: http://doc.ddart.net/mssql/sql70/da-db_1.htm

десятичного

Фиксированная точность и масштабирование числовых данных от -10 ^ 38 -1 до 10 ^ 38 -1.

цифровая

Синоним десятичного числа.

INT

Целочисленные (целые числа) данные от -2 ^ 31 (-2 147 483 648) до 2 ^ 31 - 1 (2 147 483 647).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...