Oracle新人のRACインストール その15

投稿日: 2006年8月09日

<Oracle新人のRACインストール その15>
ペンネーム: world famous beagle

さあ、今週のテーマは「SGAとは」!!
RACをインストールしながら、Oracleの勉強もしていかなければなりませんか
らね。

先週に引き続き、印旛くんは初期化パラメータを勉強中です。
db_block_sizeの後に、印旛くんの目に付いたのは・・・

sga_max_size
sga_target

今週は、この2つのパラメータを通して、印旛くんがSGAを理解します。
それでは、スタート!

「db_block_sizeの次は・・・。SGAにいってみようかな。
sga_max_sizeとsga_targetっていう2つのパラメータがある」

うーん。設計書を見るとどちらも数字が書いてあるからサイズを指定している
のかな。だとすると、sga_targetはなんのサイズだろうか???
まあ、そもそもSGAって聞いたことはあるけど、
何だかよくわかんないから、そこからかな。
岸田さんには聞けないから、とりあえず自分で調べるか。

SGAは、たしかSystem Global Areaだったかな?
Oracleインスタンスの中にあるんだよね。メモリ空間にぽこっと。
さて、何をしてるんだろうか?

SGAの構成要素は・・・
・共有プール
・データベースバッファキャッシュ
・REDOログバッファ
・Javaプール
・ラージプール
・ストリームプール

ついでに、バックグラウンドプロセスも覚えよう。
バックグラウンドプロセスは、インスタンスの起動と同時に起動するプログラ
ムのことだったよね。
主なものは・・・
・DBWn(データベースライタ)
・LGWR(ログライタ)
・CKPT(チェックポイント)
・ARCn(アーカイバ)
・SMON(システムモニタ)
・PMON(プロセスモニタ)

そっか、Oracleインスタンスっていうのは、このSGAとバックグラウンドプロ
セスの集合のことをいうんだな。

「富樫さん、SGAの勉強をしているんですけど、何か、アドバイスってありま
すか?」
「じゃあ、SGAがあるとどんないいことがあると思う?」
「え?どういうことですか?」
「なんか意味がないとSGAなんて作らないでしょ?」
「うーん、SGAの利点ですよね」

「ヒントは、I/O」
「あ!そっか。SGAの中のデータベースバッファキャッシュに、データファイ
ルから読み込んだデータブロックを保存するんでしたよね。そうすると、その
データはSGAのメモリ上にあるんだから、ディスクに読み込みに行かずにすむ
んだ」
「そうだね」
「じゃあ、SGAを作ることで、OracleはディスクI/Oを減らして、DBのパフォー
マンスを向上させようとしたんですね。”○○アの夜明け”みたいなドラマがあ
ったんだろうなぁ」
「それは知らないけど・・・」
「ちょっと調子に乗りました、すみません」

「じゃあ、もう少し勉強しようか」
「はい」
「SQLはどうやってSGA内で処理されてるでしょう?」
「あの、全くわかりません」
「じゃあ推理してみて。例えば検索処理の時は、どうなるでしょう?」
「うーん。僕が自分のパソコンから、DBにつないで、select文をうつってこと
ですよね?」
「まあ、そうだね」
「データベースバッファキャッシュに、欲しいデータがあると、すぐ返ってく
るんでしたよね?」
「そうだね。けど、それはあくまでもそのデータがバッファにあった時だね」
「わかりません・・・」

簡単に説明すると・・・
1.SQLは、まずそのSQLが実行できるかどうか、
構文が正しいかどうか解析される
2.その後に、同じSQLが実行されていないか、共有プール内のSQL領域を探す
3.SQLが実行されていなかったら、SQL文をコンパイルする
4.SQL文が実行される
5.まず、データベースバッファにデータがあるかどうか検索し、
存在した場合は読み込む
6.バッファにデータがなかった場合は、ディスクにアクセスし、
目的のデータを読み込む

「うーん、なるほど。
SQLもデータもよく使われるものは、SGA内にあるってことですね」
「お、いいね」
「はい、説明がわかりやすかったです。ありがとうございました」

SGAについては、大体わかったかな。パラメータを調べてみよう。
とりあえずマニュアルかな。
■sga_max_size
インスタンスの存続期間を通してのSGAの最大サイズを指定します。
もし、db_cache_size、log_buffer、shared_pool_size、large_pool_sizeの
合計値よりもsga_max_sizeの値の方が小さかった場合は、
sga_max_sizeの値は無視されます。

■sga_target
すべてのSGAコンポーネントのサイズ合計を指定する
sga_targetが指定されている場合、バッファ・キャッシュ、Javaプール、
ラージ・プール、共有プールのメモリー・プールは、自動的にサイズ設定され
ます。

—自動共有メモリ管理とsga_target—
Oracle10gから、自動共有メモリ管理という新しい機能がOracleに加わってい
ます。これは、sga_targetパラメータを設定しておくことで、db_cache_size、
shared_pool_size、large_pool_size、java_pool_size、stram_pool_size
パラメータがそのシステムに合わせて自動的にサイジングされるという
機能です。
(*自動共有メモリ管理を使用するには、sga_targetパラメータをゼロ以外の
値に設定し、statistics_levelパラメータをTYPICALまたはALLに設定します)

「ってことは、sga_targetの値は、
sga_max_sizeを超えることはできない、ってことだよね。
じゃあ、どこまで値を小さくできるのかな?」

---sga_targetパラメータのサイズ変更----------------------------------
SQL> alter system set sga_target = ****m;

System altered.

  →sga_max_sizeの値まで、動的に大きくすることができる

SQL> alter system set sga_target = ****m; 
  →sga_max_sizeよりも大きい値に設定しようとすると・・・

alter system set sga_target = ****m
*
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-00823: Specified value of sga_target greater than sga_max_size
----------------------------------------------------------------------

どこまで小さくできるかは、なんだか難しい気がするな・・・。
調べなきゃ。

うーん。なるほど。
sga_targetは、コンポーネントの内のどれかが最小値になるまで小さくできる
のか。ってことは、db_cache_size、shared_pool_size、large_pool_size、
java_pool_sizestram_pool_sizeパラメータの内どれかが最小値になるまでっ
てことだな。

うん。これは気をつけなきゃいけないかも。
手動の管理から自動共有メモリ管理に変更した場合は、現状のサイズよりも、
自動共有メモリ管理を適用して、サイズが大きくなった場合にのみ、
リサイズされるみたいだ。
これは覚えておこう!

うーん。なんかわかってきたな。
そういえば、SGAがなるべくディスクI/Oを減らすために設計されているなら、
いっそこと、データベースを全部メモリ上に置いちゃえばいいのにな。
超高速データベースになるんじゃないだろうか・・・。

どうせそうじゃないから、Oracleはそんなことしてないんだろうけど・・・。
どんな理由だろうなぁ・・・。
「岸田さん、なんでOracleはメモリにデータベースを作らずに、ディスクを
使うんですか?全部メモリにあった方が早いんですよね?」
「・・・・・・・」
「あ、なかなかいい質問だったりしますか?」
「メモリの方が、ディスクより値段が高いから」
「・・・・・・・」
「じゃあ、シングルインスタンスとRACインスタンスのSGAの違いは?」
「あの、それはまだ考えたことがなかったです・・・」
「RACはインスタンスが2つあるよね。同時にデータを更新しちゃったりしたら、
データの整合性が合わなくなるよね?」
「そうですね・・・」
「じゃあ、明日までに調べてきて」
「わかりました」

————————————————————————-
ようやく始まった、印旛くんのオラクリストへの道。
いかがでしょうか?

まだまだ先は長そうですが、一歩ずつ・・・。
千里の道もなんとやらです。