我正在创建一些有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数据库。
答案 0 :(得分:2)
您不应该使用序列的结果进行排序。这可能看起来很奇怪,但想想如何缓存序列并考虑RAC。每个实例都有自己的序列缓存....对于性能,你需要大缓存。最好将序列称为随机唯一密钥生成器,这些生成器恰好在大多数情况下顺序工作。
时间戳格式的时间分辨率高达微秒级别。当硬件变得更快并且负载增加时,可能会同时获得多行。你可以做的事情并不多,直到oracle再次将分辨率提高了一步。
答案 1 :(得分:0)
使用INSERT
触发器填充id
和ts
列。
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
是否意味着无意义的主键(它通常在应用程序中 - 它只是加入的关键)?