在Oracle中选择更高的时间戳精度有什么缺点?

时间:2010-10-10 13:52:05

标签: oracle timestamp

Oracle允许在表中指定TIMESTAMP类型的精度 - SECOND日期时间字段的小数部分中的位数。指定最大精度TIMESTAMP(9)是否有任何缺点?

我能想到的一个原因是这些信息可能会被Oracle工具用于更漂亮的输出。

最多9个数字表示该字段存储为4字节整数,因此它不应该有任何性能影响,如果我在这里错了,请更正。

4 个答案:

答案 0 :(得分:15)

没有缺点,如果有意义,请使用时间戳(9)。

时间戳(9)和时间戳(1)使用相同的空间量,并且它们的性能相同。我只能找到一个存在性能差异的情况,在这种情况下,时间戳(9)实际上比时间戳(1)更快。

(我将为您省去插入时间戳(1)和时间戳(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

当使用current_timestamp时,这是timestamp(9)更快的地方,您可能需要在某个时刻使用它来生成数据。但是我们只讨论慢速桌面上大约0.175和0.25秒之间的差异,以生成100K时间戳。我不确定为什么timestamp(9)更快,也许时间戳总是生成为timestamp(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
);

编辑:性能差异存在于10g但不是11g。

答案 1 :(得分:0)

问题在于表现。你必须精确地交易它。较小的数字是用较少的CPU指令重新编写的。 CPU指令只需不到一纳秒,但如果您的服务器服务于数百万个事务,您可能会发现某些性能下降,这表明您采用的精度较低,甚至没有精度(在大多数情况下,所有时间戳到秒都是可以接受的) ,甚至在银行业。)

但是,如果你出于某种原因,即。实时系统日志记录,需要更高的精度,您被迫使用更高的精度,从而降低性能。如果您的服务器没有处理大量的tps,那么几乎没有性能影响,但如果您不需要精确度,则会浪费内存。

希望得到帮助。如果您想与我们分享您的数据库要求,我们可能会帮助您选择最佳的妥协方案。

答案 2 :(得分:0)

差异不在于Timestamp数据类型的技术用途,而在于应用程序。当在标有critical infrastructure的应用中使用时,FERC和NERC通常需要一定的精度,因此它们将使用最高精度。

当然,让西装满意他们的事件序列记录往往需要做的不仅仅是CIP-002 through CIP-009

答案 3 :(得分:0)

如果您总是在Oracle和中间层中将数据用作“日期/时间戳”数据类型,则没有任何缺点,但是您必须了解整个应用程序/解决方案如何使用该列。

  • 您是否在显示数据之前截断数据?
  • 是否符合合规要求,主要是阅读?
  • 您是否将该列转换为字符串以将其与另一列进行比较?
  • 是审计或订单捕获的要求吗?

不要过分担心读写性能差异,可忽略不计,从存储到UI整体评估整体需求。