Подтвердить что ты не робот

Каковы недостатки выбора более высокой точности времени в Oracle?

Oracle позволяет указать точность типа TIMESTAMP в таблице - количество цифр в дробной части поля datetime SECOND. Есть ли недостатки в определении максимальной точности TIMESTAMP(9)?

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

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

4b9b3361

Ответ 1

Нет недостатков, используйте временную метку (9), если это имеет смысл.

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

(Я пощажу вам множество строк скучного кода, вставляющих в столбцы timestamp (1) и timestamp (9), и сравнивая разные операции над ними.)

Это демонстрирует, что они используют одно и то же пространство (вставляя множество значений и сравнивая dba_segments):

--Create tables with timestamps and populate them with the same data (with different precision)
--Set initial and next to a low value so we can closely check the segment size)
create table timestamp1 (t1 timestamp(1), t2 timestamp(1), t3 timestamp(1), t4 timestamp(1), t5 timestamp(1))
storage(initial 65536 next 65536);

insert into timestamp1
select current_timestamp(1), current_timestamp(1), current_timestamp(1), current_timestamp(1), current_timestamp(1)
from dual connect by level <= 100000;

create table timestamp9 (t1 timestamp(9), t2 timestamp(9), t3 timestamp(9), t4 timestamp(9), t5 timestamp(9))
storage(initial 65536 next 65536);

insert into timestamp9
select current_timestamp(9), current_timestamp(9), current_timestamp(9), current_timestamp(9), current_timestamp(9)
from dual connect by level <= 100000;


--Segment size is identical
select segment_name, bytes from dba_segments where segment_name in ('TIMESTAMP1', 'TIMESTAMP9');

--SEGMENT_NAME   BYTES
--TIMESTAMP1     8388608
--TIMESTAMP9     8388608

В этом случае временная метка (9) выполняется быстрее при использовании current_timestamp, которую вам, вероятно, придется использовать в какой-то момент для генерации данных. Но мы говорим только о разнице между 0.175 и 0.25 секунд на моем медленном рабочем столе, чтобы генерировать отметки времени в 100 КБ. Я не уверен, почему timestamp (9) работает быстрее, возможно, временные метки всегда генерируются как временная метка (9), а затем округляются до других значений?

--current_timestamp(9) is slightly faster than current_timestamp(1)
select count(*) from
(
  select *
  from dual
  --where current_timestamp(9) = current_timestamp(9)
  where current_timestamp(1) = current_timestamp(1)
  connect by level <= 100000
);

EDIT: разница в производительности существует в 10g, но не 11g.

Ответ 2

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

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

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

Ответ 3

Разница заключается не в техническом использовании типа данных Timestamp, а в приложении. FERC и NERC часто требуют определенной точности при использовании в приложениях с меткой critical infrastructure, и поэтому они будут использовать максимально возможную точность.

Конечно, для того, чтобы костюмы были довольны своей последовательностью записей событий, часто требуется сделать больше, чем выложено CIP-002 through CIP-009

Ответ 4

Нет никаких недостатков, если вы всегда будете использовать данные в качестве типа даты и времени в Oracle и в среднем уровне, однако вы должны увидеть, как все ваше приложение/решение использует этот столбец.

  • Вы усекаете данные перед их отображением?
  • Является ли это требованием соблюдения и в основном читается?
  • Преобразуете ли этот столбец в строку, чтобы сравнить ее с другим столбцом?
  • Это требование для аудита или для захвата заказа?

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