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が必要なため、レコードの順序が悪い場合がありますが、この条件は会った。どうすればこの問題を解決できますか? 私はオラクルデータベースを使用しています。

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 に答える