助け合いフォーラム
この問題はプレミアムコンテンツです。
SELECT文の実行時の処理の流れについて
[1] ユーザー・プロセスがサーバー・プロセスへSELECT文を送信します。
[2] サーバー・プロセスは、システム・グローバル領域の共有プールに[1]のSELECT文が格納されているか確認します。
格納されている場合は、手順[6]に進みます。
[3] 格納されていない場合は、SQLの解析処理を行います。
・
・
・
[1]でSELECT文をサーバープロセスに送信していますが、その後、共有プールにそれが格納されているかどうかの確認をしています。何故でしょうか。格納されていないからユーザプロセスからSELECT文が送信されているのであって、格納されているのであればユーザプロセスからSELECT文を送信する必要はないと考えています。つまり、格納の確認作業を行うというのは送信されたSELECT文と共有プールに予め格納されているSELECT文が一致しているという前提のもとに行われると思いますが、予め共有プールにSELECT文が格納されているというのはどういう状態のことでしょうか。
[1]でSELECT文をサーバープロセスに送信していますが、その後、共有プールにそれが格納されているかどうかの確認をしています。何故でしょうか。格納されていないからユーザプロセスからSELECT文が送信されているのであって、格納されているのであればユーザプロセスからSELECT文を送信する必要はないと考えています。
そもそも、SQL文がユーザープロセス側からサーバープロセス側に送信されなければ、Oracleデータベース側は何もしませんし、何をしていいかもわかりません。ユーザープロセスからサーバープロセスに対してSQL文が送信されなければ、実行しようとしているSQL文がどのようなものか、サーバープロセスは知ることができません。ですので、共有プールにキャッシュされているSQL文と一致するかも確認しようがありません。
ユーザープロセスは、クライアントPC上で起動したSQLPlusのようなクライアントアプリケーションによって、クライアントPC側に生成されます。サーバープロセスは、サーバーマシン側に生成され(厳密にはリスナープロセスによって生成される)、ユーザープロセスからの処理要求を受け付けて、実際のSQL実行などを行います。
※1台のマシンにOracleデータベースがインストールされており、同マシン上でSQLPlusのようなクライアントアプリケーションを実行する場合でも、動きは同様です。
サーバープロセスがユーザープロセスからSQL文を受け取った後に、はじめて、その受け取ったSQL文と一致するSQL文が共有プールにあるかどうかを確認することができます。
質問の意図を理解できておらず、的外れな返答となっていたらすみません。
コメント
この投稿に対して返信しませんか?
y ye5n0
2024/05/13 00:21
回答有難うございます。申し訳ないのですが下記の文章が理解できておらず…。 >受け取ったSQL文と一致するSQL文が共有プールにあるかどうか 「受け取ったSQL文」というのはその前の文章にある(「サーバープロセスがユーザープロセスからSQL文を受け取った後」)サーバープロセス側が受け取るSQLを指していると思いますが、「一致するSQL文」というのは一体いつから共有プールに存在しているのでしょうか。