Первичные ключи Oracle: ЧИСЛО по сравнению с НОМЕРОМ (7,0)

Самый короткий вариант: , Живой На Coliru

std::string str(std::istreambuf_iterator{ifs}, {});

, Это требует заголовка .

были некоторые отчеты, что этот метод медленнее, чем предварительное выделение строки и использование std::istream::read. Однако на современном компиляторе с оптимизациями, включенными, это больше, кажется, не имеет место, хотя относительная производительность различных методов, кажется, высоко зависимый компилятора.

7
задан chris 5 August 2009 в 17:27
поделиться

3 ответа

NUMBER (7, 0) просто ограничивает область значений.

Их внутренние представления не отличаются:

CREATE TABLE t_pk (col1 NUMBER(7, 0) NOT NULL, col2 NUMBER(38) NOT NULL)

INSERT
INTO    t_pk
VALUES  (9999999, 9999999)

SELECT  DUMP(col1), DUMP(col2)
FROM    t_pk

DUMP(col1)                        DUMP(col2)
---                               ---
Typ=2 Len=5: 196,10,100,100,100   Typ=2 Len=5: 196,10,100,100,100

В Oracle , ЧИСЛО хранятся в виде сотенных цифр числового значения, нормализованного до 0,01 <= N <1 и предваренного показателем степени.

В приведенном выше примере:

  • 196 - экспонента на основе 192 ( 4 ).
  • 10 десятичное 9
  • 100 десятичное 99

Целое число читается в десятичном виде как 00.09 99 99 99 * (100 ^ 4) = 9,999,999

Чем больше цифр требуется для обеспечения требуемой точности, тем больше их будет

Когда вы вставляете точное значение в менее точный столбец, оно просто округляется до столбца 's точности и сохраняется с округлением.

Следовательно, с точки зрения производительности можно объявить столбец NUMBER (38) , поскольку это не подразумевает накладных расходов сверх NUMBER (7, 0) (для чисел, соответствующих обоим типам).

Однако, если ваши PRIMARY KEY по своей природе целочисленные, вам лучше указать точность как 0 , чтобы убедиться, что дробное значение отсутствует. когда-либо попадет в вашу таблицу.

Обновление:

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

Если ваше приложение ожидает INT32 , вы должны сделать свой номер НОМЕР (9) или ниже (или любой другой тип, который ваш клиент считает конвертируемым в Int32 ).

с точки зрения производительности можно объявить столбец NUMBER (38) , поскольку это не подразумевает накладных расходов сверх NUMBER (7, 0) (для чисел, соответствующих обоим типам).

Однако, если ваши PRIMARY KEY являются целыми по своей природе, вам лучше указать точность как 0 , чтобы гарантировать, что дробное значение никогда не попадет в вашу таблицу.

Обновление:

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

Если ваше приложение ожидает INT32 , вы должны сделать свой номер НОМЕР (9) или меньше (или любой другой тип, который ваш клиент считает конвертируемым в Int32 ).

с точки зрения производительности можно объявить столбец NUMBER (38) , поскольку это не подразумевает накладных расходов сверх NUMBER (7, 0) (для чисел, соответствующих обоим типам).

Однако, если ваши PRIMARY KEY целочисленные по своей природе, вам лучше указать точность как 0 , чтобы гарантировать, что дробное значение никогда не попадет в вашу таблицу.

Обновление:

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

Если ваше приложение ожидает INT32 , вы должны сделать свой номер НОМЕР (9) или ниже (или любой другой тип, который ваш клиент считает конвертируемым в Int32 ).

Однако, если ваши PRIMARY KEY являются целыми по своей природе, вам лучше указать точность как 0 , чтобы гарантировать, что дробное значение никогда не попадет в вашу таблицу.

Обновление:

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

Если ваше приложение ожидает INT32 , вам следует сделать свой номер ] НОМЕР (9) или ниже (или любой другой тип, который ваш клиент считает конвертируемым в Int32 ).

Однако, если ваши PRIMARY KEY являются целыми по своей природе, вам лучше указать точность как 0 , чтобы гарантировать, что дробное значение никогда не попадет в вашу таблицу.

Обновление:

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

Если ваше приложение ожидает INT32 , вы должны сделать свой номер ] НОМЕР (9) или ниже (или любой другой тип, который ваш клиент считает конвертируемым в Int32 ).

Если ваше приложение ожидает INT32 , вы должны сделать свой номер NUMBER (9) или ниже (или любой другой тип, который ваш клиент считает конвертируемым в Int32 ).

Если ваше приложение ожидает INT32 , вы должны сделать свой номер NUMBER (9) или ниже (или любой другой тип, который ваш клиент считает конвертируемым в Int32 ).

10
ответ дан 6 December 2019 в 12:53
поделиться

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

Но стоит отметить, что это может также повлиять на приложения, которые обращаются к базе данных (или, точнее, на разработчиков этих приложений). Например, в .NET, если вы получите IDataRecord , включая ваш первичный ключ (с использованием ODP .NET), вызов GetInt32 завершится неудачно, если ваш столбец определен как NUMBER (38 ) и успешно, если задано как ЧИСЛО (7) (даже если значение находится в правильном диапазоне).

Но стоит отметить, что это также может повлиять на приложения, которые обращаются к базе данных (или, чтобы быть точнее, на разработчиков этих приложений). Например, в .NET, если вы получите IDataRecord , включая ваш первичный ключ (с использованием ODP .NET), вызов GetInt32 завершится неудачно, если ваш столбец определен как NUMBER (38 ) и успешно, если задано как ЧИСЛО (7) (даже если значение находится в правильном диапазоне).

Но стоит отметить, что это может также повлиять на приложения, которые обращаются к базе данных (или, точнее, на разработчиков этих приложений). Например, в .NET, если вы получите IDataRecord , включая ваш первичный ключ (с использованием ODP .NET), вызов GetInt32 завершится неудачно, если ваш столбец определен как NUMBER (38 ) и успешно, если задано как ЧИСЛО (7) (даже если значение находится в правильном диапазоне).

4
ответ дан 6 December 2019 в 12:53
поделиться

Если вы не ожидаете большего, скажем, 100К записей в в таблице, если вы укажете PK с помощью N (7,0), вы получите раннее предупреждение, если какой-то неконтролируемый процесс закончится переполнением PK.

2
ответ дан 6 December 2019 в 12:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: