如何保证oracle数据库中主键和时间戳的顺序

时间:2012-05-11 11:58:01

标签: oracle

我正在创建一些有id,ts的记录......所以首先我调用select来获取ts和id:

  select SEQ_table.nextval, CURRENT_TIMESTAMP from dual

然后我调用insert

insert into table  ...id, ts ...

这在99%有效,但有时当负载很大时,记录的顺序很糟糕,因为我需要record.id< (记录+ 1).id和record.ts< (记录+ 1).ts但满足此条件。我怎么能解决这个问题?我正在使用oracle数据库。

2 个答案:

答案 0 :(得分:2)

您不应该使用序列的结果进行排序。这可能看起来很奇怪,但想想如何缓存序列并考虑RAC。每个实例都有自己的序列缓存....对于性能,你需要大缓存。最好将序列称为随机唯一密钥生成器,这些生成器恰好在大多数情况下顺序工作。

时间戳格式的时间分辨率高达微秒级别。当硬件变得更快并且负载增加时,可能会同时获得多行。你可以做的事情并不多,直到oracle再次将分辨率提高了一步。

答案 1 :(得分:0)

使用INSERT触发器填充idts列。

create table sotest
(
id number,
ts timestamp
);

create sequence soseq;

CREATE OR REPLACE TRIGGER SOTEST_BI_TRIG BEFORE
  INSERT ON SOTEST REFERENCING NEW AS NEW FOR EACH ROW   
  BEGIN
    :new.id := soseq.nextval;
    :new.ts := CURRENT_TIMESTAMP;
  END;
/

PHIL@PHILL11G2 > insert into sotest values (NULL,NULL);

1 row created.

PHIL@PHILL11G2 > select * from sotest;

    ID TS
---------- ----------------------------------
     1 11-MAY-12 13.29.33.771515

PHIL@PHILL11G2 > 

您还应该注意提供的其他答案。 id是否意味着无意义的主键(它通常在应用程序中 - 它只是加入的关键)?