5

私のasp.netアプリケーションは、いくつかのシーケンスを使用してテーブルの主キーを生成します。データベース管理者はキャッシュ サイズを 20 に設定しました。現在、アプリケーションはテスト中で、毎日いくつかのレコードが追加されています (たとえば、ユーザー テスト セッションごとに 4 つ)。新しいテスト セッション レコードは、前日にキャッシュされた数値が期限切れになり、毎日 10 分の 1 のキーが失われたかのように、常に新しいキャッシュ部分を使用することがわかりました。アプリケーションで犯した可能性のある間違い(テーブルアダプターの破棄など)が原因なのか、それとも通常の動作なのかを理解したいと思います。Oracleシーケンスを処理する際に考慮すべきプログラミングのベストプラクティスはありますか?

アプリケーションは大きな作業負荷 (たとえば、1 日に 20 ~ 40 件の新しいレコード) を負担する必要がないため、キャッシュ サイズを小さく設定するか、まったく設定しないかを考えていました。シーケンス キャッシュのサイズ変更は、現在のインデックスのリセットを意味しますか?

ヒントを事前にありがとう

4

4 に答える 4

7

このスレッドの Justin Cave からの回答は、あなたにとって興味深いかもしれません。

http://forums.oracle.com/forums/thread.jspa?threadID=640623

簡単に言えば、シーケンスが十分に頻繁にアクセスされていなくても、ライブラリ キャッシュに大量の「トラフィック」がある場合、シーケンスは期限切れになり、キャッシュから削除される可能性があります。その場合、事前に割り当てられた値は失われます。

それが非常に頻繁に発生する場合は、シーケンスがあまり使用されていないようです。

キャッシュサイズを減らす(または完全に無効にする)ことは、あなたのケースではパフォーマンスに目立った影響を与えないと思います(また、1日に20〜40の新しいレコードのステートメントを考慮に入れる場合)

于 2011-02-16T13:39:55.070 に答える
2

OracleSequencesはギャップフリーではありません。キャッシュサイズを小さくするとギャップが小さくなります...ただし、ギャップは残ります。シーケンスはデータベースによってテーブルに関連付けられていませんが、コードによって(trigger / sql / pkg apiを介した挿入のnextvalを介して)-そのメモでは、複数のテーブルで同じシーケンスを使用できます(列/テーブルに関連付けられているSQLサーバーのID)

したがって、順序を変更してもインデックスには影響しません。

シーケンスを削除して再起動した場合は、現在の値の+1に「再シード」する必要があります(たとえば、125nocacheで始まるシーケンスシーケンスの作成;)

、 しかし

アプリケーションでギャップのない数値のセットが必要な場合は、Oracleシーケンスを使用できません。独自に開発したコードを使用して、データベース内のアクティビティをシリアル化する必要があります。

ただし、シーケンスを使用しないことを選択した場合は、ディスクIOが増加し、トランザクションロックが発生する可能性があることに注意してください。

シーケンスジェネレータは、マルチユーザー環境で、ディスクI/Oやトランザクションロックのオーバーヘッドなしに一意の番号を生成するのに役立ちます。

a_horse_with_no_nameのコメントを繰り返すために、IDのギャップの問題は何ですか?


編集 には、使用する必要のあるキャッシングロジックも参照してください: http ://download.oracle.com/docs/cd/E11882_01/server.112/e17120/views002.htm#i1007824


于 2011-02-16T13:03:08.253 に答える
1

PK のシーケンスを使用していて、一部のアプリケーション ロジックを強制しない場合は、ギャップについて心配する必要はありません。ただし、シーケンシャル シーケンス値に結び付けられたアプリケーション ロジックがある場合、シーケンス キャッシングを使用していてシステムがビジーでない場合は、穴が開いてしまいます。シーケンス キャッシュ値は、ライブラリ キャッシュからエージング アウトできます。

あなたのシステムはあまりビジーではないと言っています。この場合、シーケンスをキャッシュなしに変更します。ロジックの問題を修正するために、ごくわずかなパフォーマンスの影響を受ける立場にあるので、そうする必要があります。

于 2011-02-16T20:56:44.757 に答える
0

人々が述べたように:ギャップは問題ではないはずです、それであなたがギャップを必要としないならあなたは何か間違ったことをしています。(しかし、私はこれがあなたが望むものではないと思います)。

キャッシュを減らすと、シーケンスの数が減り、シーケンスのパフォーマンスが低下します。特に、キャッシュへの同時アクセスの場合はそうです。(これは、ユースケースでは問題にならないはずです)。

alter sequenceステートメント(http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_2011.htm)を使用してシーケンスを変更しても、シーケンスの現在/次の値はリセットされません。

于 2011-02-16T13:23:18.687 に答える