質問

DateとSilberschatzをざっと読みましたが、これらの特定の質問に対する答えが見つからないようです。

  1. 2人のデータベースユーザーがクエリを発行した場合-たとえば、 'select * from AVERYBIGTABLE;' -一般にクエリの結果はどこに保存されますか?つまり、結果セットのサイズとは無関係ですか?

    a。 DBMSサーバーのOS管理の物理/仮想メモリ内にありますか?

    b。 DBMSで管理された一時ファイルの場合

  2. クエリ結果セットは接続ごとに維持されますか?

  3. クエリ結果セットが接続ごとに実際に維持されている場合、接続プールが有効になっている場合(DBMSの上にあるコード層によって)では、結果セットは(接続ごとではなく)クエリごとに維持されませんか?

  4. ユーザーが選択クエリを同時に発行している間にデータベースがリアルタイムで変化している場合、クエリ発行者によってまだ(完全に)実行されていないクエリはどうなりますか?たとえば、結果セットに50,000行があると仮定します。ユーザーは現在、100番目に反復しています。別のユーザーが挿入/削除を並行して実行すると、DBMSのユーザーによって以前のクエリが再発行された場合に50,000行を超える/未満になりますか?

  5. 一方、リアルタイムで変更されないデータベースの場合、2人のユーザーがそれぞれ同じであるが非常に大きな結果セットを持つ同じクエリを発行すると、DBMSは結果セットの2つの同じコピーを保持します。または、単一の共有コピーがありますか?

事前に感謝します。

役に立ちましたか?

解決

この中には、Oracleに固有のものもあります。

  1. クエリの全結果をコピーする必要はありません。各ユーザーは、取得された行とフェッチされる必要がある行を保持するカーソル(ポインタなど)を取得します。データベースは、テーブルからデータを読み取るときにできるだけ多くのデータをキャッシュします。 2人のユーザーがファイルの読み取り専用ファイルハンドルを持っているのと同じプリンシパル。

  2. カーソルは接続ごとに維持され、次の行のデータは既にメモリ内にある場合とない場合があります。

  3. 大部分の接続はシングルスレッドであり、一度に1つのクライアントのみが接続を使用できます。同じクエリが同じ接続で2回実行されると、カーソル位置がリセットされます。

  4. 更新中のテーブルでカーソルが開いている場合、古い行は別のスペースにコピーされ(Oracleで元に戻す)、カーソルの寿命の間、または少なくともそれがなくなるまで維持されます。それを維持するためのスペース。 (Oracleはスナップショットが古すぎるエラーを表示します)

  5. データベースは、キャッシュに保存されたデータを複製しません。Oracleの場合、カーソルを共有すると、単一のキャッシュカーソルが存在し、各クライアントカーソルはキャッシュカーソル内の位置を維持するだけです。

Oracleデータベースの概念

質問1、2、5については8メモリを参照

「13データの同時実行性と一貫性(質問3、4)」を参照

他のヒント

日付などでこれが見つからない理由は、DBMS製品間で変更される可能性があるためです。データベースへの接続のプールや、クエリからの結果セットの保持方法(キャッシングなど)についてのリレーショナルモデル理論には何もありません等)。部分的にカバーされる唯一のポイントは4-読み取りレベルが作用する場所(コミットされていない読み取りなど)ですが、これは結果セットが生成されるまで適用されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top