助け合いフォーラム

Oracle DB

Oracle Master Bronze DBA 2019(1Z0-085)
問題ID : 29847
問題を開く
REDOログ・ファイルに格納されるものはどれですか(2つ選択して下さい)。

この問題はプレミアムコンテンツです。

上に戻る

SELECT文の実行時の処理の流れについて

投稿日 2024/05/11

 [1] ユーザー・プロセスがサーバー・プロセスへSELECT文を送信します。
 [2] サーバー・プロセスは、システム・グローバル領域の共有プールに[1]のSELECT文が格納されているか確認します。
    格納されている場合は、手順[6]に進みます。
 [3] 格納されていない場合は、SQLの解析処理を行います。


[1]でSELECT文をサーバープロセスに送信していますが、その後、共有プールにそれが格納されているかどうかの確認をしています。何故でしょうか。格納されていないからユーザプロセスからSELECT文が送信されているのであって、格納されているのであればユーザプロセスからSELECT文を送信する必要はないと考えています。つまり、格納の確認作業を行うというのは送信されたSELECT文と共有プールに予め格納されているSELECT文が一致しているという前提のもとに行われると思いますが、予め共有プールにSELECT文が格納されているというのはどういう状態のことでしょうか。

2024/05/12 22:31

[1]でSELECT文をサーバープロセスに送信していますが、その後、共有プールにそれが格納されているかどうかの確認をしています。何故でしょうか。格納されていないからユーザプロセスからSELECT文が送信されているのであって、格納されているのであればユーザプロセスからSELECT文を送信する必要はないと考えています。

そもそも、SQL文がユーザープロセス側からサーバープロセス側に送信されなければ、Oracleデータベース側は何もしませんし、何をしていいかもわかりません。ユーザープロセスからサーバープロセスに対してSQL文が送信されなければ、実行しようとしているSQL文がどのようなものか、サーバープロセスは知ることができません。ですので、共有プールにキャッシュされているSQL文と一致するかも確認しようがありません。

ユーザープロセスは、クライアントPC上で起動したSQLPlusのようなクライアントアプリケーションによって、クライアントPC側に生成されます。サーバープロセスは、サーバーマシン側に生成され(厳密にはリスナープロセスによって生成される)、ユーザープロセスからの処理要求を受け付けて、実際のSQL実行などを行います。
※1台のマシンにOracleデータベースがインストールされており、同マシン上でSQL
Plusのようなクライアントアプリケーションを実行する場合でも、動きは同様です。

サーバープロセスがユーザープロセスからSQL文を受け取った後に、はじめて、その受け取ったSQL文と一致するSQL文が共有プールにあるかどうかを確認することができます。

質問の意図を理解できておらず、的外れな返答となっていたらすみません。


コメント

y ye5n0

2024/05/13 00:21

回答有難うございます。申し訳ないのですが下記の文章が理解できておらず…。 >受け取ったSQL文と一致するSQL文が共有プールにあるかどうか 「受け取ったSQL文」というのはその前の文章にある(「サーバープロセスがユーザープロセスからSQL文を受け取った後」)サーバープロセス側が受け取るSQLを指していると思いますが、「一致するSQL文」というのは一体いつから共有プールに存在しているのでしょうか。

r rink_rew

2024/05/14 14:57

> 「受け取ったSQL文」というのはその前の文章にある(「サーバープロセスがユーザープロセスからSQL文を受け取った後」)サーバープロセス側が受け取るSQLを指していると思いますが、 はい、ご認識の通りです。 > 「一致するSQL文」というのは一体いつから共有プールに存在しているのでしょうか。 「一致するSQL文」は、過去に実行されたSQL文のことをさしています。Oracleデータベースでは、一度実行されたSQL文やその解析結果の情報が、SGAの共有プール内に保持され、将来、同一のSQL文がユーザープロセスから発行された場合に、この共有プール内に「過去に実行されて解析済みのSQLの情報があるか」を確認します。 これらは、共有プールのサイズが不足すると古いものから削除されていきます。※パラメータの設定などで多少挙動の変更は可能。

r rink_rew

2024/05/14 14:59

別の問題ですが、問題ID:29541にSGAや共有プールの解説がありましたので、こちらも参照してみると良いかもしれません。 ▼問題ID: 29541 ---------------------------------------- [共有プール] 共有プールは、実行されたSQLやその解析結果、データ・ディクショナリ(データベースに関する様々な管理情報が格納された読取り専用の表)の情報などを保持する領域です。 Oracle Databaseでは、SQL文を実行する際、構文に誤りはないか、指定された表が存在するか、アクセス権はあるか等、SQL文の解析作業を行いますが、解析作業にはそれなりのCPUリソースを消費します。そこで、SQL文の解析結果を共有プールにキャッシュし、次に同じSQL文が実行される際に共有プールから情報を取り出し、処理の高速化や、リソースの浪費を防ぐために使用されます。共有プールのサイズを増やせば、より多くのSQL文をキャッシュできます。 なお、共有プールの情報は他のユーザーと共有されます。 ----------------------------------------

y ye5n0

2024/05/14 20:07

ご回答有難うございます。下記の文で共有プールに存在するタイミング、その必要性(用途)について理解することができました。 >一度実行されたSQL文やその解析結果の情報が、SGAの共有プール内に保持され・・・ >解析作業にはそれなりのCPUリソースを消費・・・共有プールから情報を取り出し、処理の高速化や、リソースの浪費を防ぐために使用

この返信に対して
コメントを記入できます

この投稿に対して返信しませんか?