0

私はDBAではありません。Oracleのマルチバージョン同時実行モデルについて知りたいだけです。

DML操作を開始するとき、MVCCプロトコルの最初のステップはUNDOセグメントをバインドすることです。問題は、なぜ1つのUNDOセグメントが1つのアクティブなトランザクションにしか対応できないのかということです。

お時間をいただきありがとうございます~~

4

2 に答える 2

1

マルチバージョン同時実行は、Oracleに関して把握するためのおそらく最も重要な概念です。DBAになりたくない場合でも、プログラマーがそれを理解するのは良いことです。

これにはいくつかの側面がありますが、それらはすべて効率に帰着します。UNDO管理はオーバーヘッドであるため、それに費やされるサイクル数を最小限に抑えることで、データベースの全体的なパフォーマンスに貢献します。

  1. トランザクションは多くのステートメントで構成され、多くの取り消しを生成する可能性があります。単一の行を挿入したり、3万を削除したりする場合があります。十分なスペースがある部分的に埋められたブロックを継続的に偵察するのではなく、最初に1つの空のUNDOブロックを割り当てることをお勧めします。
  2. それに続いて、undoブロックを共有するには、カーネルが使用状況をより細かい粒度で追跡する必要がありますが、これは複雑さを増すだけです。
  3. トランザクションが完了すると、取り消しが解放されます(ただし、次のポイントを参照してください)。トランザクションが使用するブロックが少ないほど、リセットする必要のあるラッチも少なくなります。さらに、ブロックが共有されている場合は、ブロックのシャードを解放する必要がありますが、これはさらに手間がかかります。
  4. MVCCの重要な点は、読み取りの一貫性です。これは、実行時間の長いクエリによって返されるすべてのレコードが、クエリの開始時の状態で表示されることを意味します。したがって、実行に15分かかるEMPテーブルでSELECTを発行し、途中ですべての給与の更新をコミットすると、変更は表示されません。データベースは、トランザクションで使用されたブロックから元に戻るデータを取得することでこれを行います。 。繰り返しますが、これは、すべてのUNDOデータが1つまたは2つのブロックに配置されている場合にはるかに簡単です。
于 2011-06-04T11:13:18.670 に答える
1

「なぜ1つのUNDOセグメントが1つのアクティブなトランザクションにしか対応できないのですか?」

これは単に設計上の決定です。これが、undoセグメントが機能するように設計されている方法です。以前のロールバックメカニズムで発生する可能性のある問題のいくつかに対処するために行われたと思います。

ロールバック(まだ使用可能ですが、元に戻すために非推奨)には、DBAによるロールバックセグメントの明示的な作成が含まれ、複数のトランザクションを単一のロールバックセグメントに割り当てることができます。これにはいくつかの欠点がありました。最も明らかなのは、特定のセグメントに割り当てられた1つのトランザクションが、セグメントがいっぱいになる(そして拡張できなくなる)十分なロールバックデータを生成した場合、同じセグメントを使用する他のトランザクションは、生成する操作を実行できなくなることです。データをロールバックします。

新しい取り消し機能の設計目標の1つは、この種のトランザクション間の依存関係を防ぐことだったと思います。したがって、彼らはDBAがUNDO表領域のサイズを決定して作成するようにメカニズムを設計しましたが、その中のセグメントの管理はOracleによって内部的に行われます。これにより、トランザクションごとに専用セグメントを使用できます。表領域がいっぱいになった場合(および自動拡張できない場合)、これらは相互に問題を引き起こす可能性がありますが、セグメントレベルでは、あるトランザクションが別のトランザクションに問題を引き起こす可能性はありません。

于 2011-06-04T13:49:56.440 に答える