1

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

  select SEQ_table.nextval, CURRENT_TIMESTAMP from dual

然后我调用插入

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

这在 99% 中效果很好,但有时当负载很大时,记录的顺序很糟糕,因为我需要 record.id < (record+1).id 和 record.ts < (record+1).ts 但这个条件是遇见了。我该如何解决这个问题?我正在使用 oracle 数据库。

4

2 回答 2

2

您不应使用序列的结果进行排序。这可能看起来很奇怪,但请考虑如何缓存序列并考虑 RAC。每个实例都有自己的序列缓存....为了性能,您需要大缓存。最好将序列称为随机唯一密钥生成器,它们在大多数时间都按顺序工作。

时间戳格式的时间分辨率高达微秒级。当硬件变得更快并且负载增加时,您可能会同时获得多行。在甲骨文再次采取决议之前,您对此无能为力。

于 2012-05-11T12:32:22.297 回答
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一个无意义的主键(它通常在应用程序中 - 它只是一个加入的键)?

于 2012-05-11T12:30:45.243 回答