Для столбцов NUMBER в Oracle помогает ли указание длины повысить производительность? - PullRequest
8 голосов
/ 16 ноября 2010

Есть ли истинная разница в производительности между NUMBER, NUMBER (3) и NUMBER (10)?Разве СУБД не использует 32 бита для хранения значения независимо и просто ограничивает длину данных, если рассматривать их как строку?

Коллега поспорил, что, например, было бы более эффективно использовать NUMBER(10) против NUMBER / NUMBER (11), полагая, что n - это количество байтов, а не длина данных в символах.Обычно я бы согласился ограничить размер столбца, если было гарантировано, что количество строк не превысит 10 ^ n или около того, но для этой конкретной базы данных ограничение на количество строк было буквально «как можно больше», например, 2 ^ 32или ~ 4 миллиарда, хотя мы никогда не достигнем этой суммы.Достижение «наименьшего максимума» в этой ситуации кажется бессмысленным и пустой тратой времени, и я подумал, что использование NUMBER без указания длины будет проще и не повлечет за собой штрафов.Я прав?

Ответы [ 3 ]

11 голосов
/ 16 ноября 2010

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

Одно и то же числовое значение (например, 100, 4.3) принимает одно и то же внутреннее значение независимо от точности и масштаба, определяющих столбец.

Максимальное значение, которое может содержать столбец, определяется ОБА точностью и масштабом. То есть вы можете сохранить значение 100 в столбце NUMBER (3,0), но не в столбце NUMBER (3,1).

Как правило, если столбец не должен хранить десятичную дробь, масштаб должен быть равен нулю. Имейте в виду, что если вы попытаетесь сохранить 10.12 в NUMBER (3,0), он сохранит значение 10. Это не ошибка (потому что если бы это произошло, вам было бы трудно сохранить значение одной трети в что-нибудь). Если вы хотите, чтобы он выдавал ошибку, вы хотите разрешить более высокий масштаб и использовать ограничение, чтобы прекратить его использование.

Я также считаю, что вы должны попытаться использовать «разумную» точность. Если бы вы хранили тысячу значений каждую секунду в течение тысячи лет, вы бы все равно поместили это в 14 цифр. Если я вижу столбец NUMBER (14,0), то я знаю, что на моем экране или распечатке я должен разрешить отображение 14 числовых символов. Если я вижу только НОМЕР или НОМЕР (38,0), то мне на самом деле не дают никаких указаний, и я могу предположить 14 символов. И если они начнут вводить 16-значные номера кредитных карт, я буду неправ. Вот почему я предпочитаю не догадываться.

Также в PL / SQL у них есть тип данных PLS_INTEGER, который подходит до 2147483647. Если я вижу столбец NUMBER (9,0), я знаю, что могу вписать его в PLS_INTEGER. Вероятно, существуют аналогичные соображения для Java, .Net и т. Д., Когда они хотят выяснить, какой тип данных, масштаб и точность следует использовать при извлечении / отправке данных в базу данных.

8 голосов
/ 16 ноября 2010

Не имеет значения, используете ли вы NUMBER(1) или NUMBER(10). Требования к хранилищам одинаковы и зависят от данных, которые вы в них храните.

Единственная возможная разница в производительности - между NUMBER() и NUMBER(N), поскольку последняя должна будет проверять размер при хранении. Но это настолько незначительно, что, вероятно, даже не поддается измерению.

4 голосов
/ 16 ноября 2010

По поводу 32 бит - нет.В Oracle тип NUMBER - это значение с плавающей запятой переменной длины длиной 10 с гарантированной точностью 38 цифр.См. документы Oracle и этот вопрос AskTom .

<<em> soapbox >

На самом деле, я думаю, что NUMBER на самом деле является одним из Лучшие вещи в Oracle.Я прочитал трюизм о том, что «любой продукт (язык, база данных и т. Д.), Который требует, чтобы разработчики знали и заботились о количестве битов в числовой переменной, непригоден для бизнес-программирования» и полностью с ним согласен.Есть нет причин, по которым кто-то, пишущий программное обеспечение для бухгалтерского учета, может кричать о том, будет ли его значение соответствовать 32-разрядному масштабированному десятичному числу или могут ли проблемы с плавающей запятой ANSI двойной длины вызывать проблемы (они будут)или множество других проблем, которые вращаются вокруг проблемы чисел в компьютерах.Числа слишком важны, чтобы быть слишком эффективными.YMMV.

<<em> / soapbox >

Поделитесь и наслаждайтесь.

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