Есть ли причина для числовых, а не 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 были бы более чем достаточно.

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

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

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

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

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

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

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

Ответ 8

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

Ответ 9

В соответствии с: 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).

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