SGA 〜システムグローバルエリア〜
SGA
〜システムグローバルエリア〜
0.更新履歴
- 2001.01.21 新規作成
- 2002.11.06 Oralce9iR2での動的SGA変更について追記
- 2003.04.03 ご参考にPGA変更方法へのリンクを追加.
1.はじめに
このドキュメントは,OracleのSGA(システムグローバルエリア)について記述するものである.
2.SGAとは
SGAとは,Oracleに割り当てられたメモリ領域で,Oracleインスタンスに特有の制御情報やデータを保持する.
SGA内は,次のような領域を持っている.
SGA内の領域
データベース
バッファキャッシュ |
データベースファイルからのデータが格納される,SQL文で要求された処理を実際のファイル操作でなくメモリ上で行うための領域. |
REDOログバッファ |
データベースバッファキャッシュに対して行われた変更処理の情報が格納されている. |
共有プール |
ユーザからのSQL文を実行するための処理手順や,データディクショナリが課k脳される. |
Oracleは,データ処理要求をメモリ上で行おうとする.
- 要求のあったデータがSGAのデータベースバッファキャッシュにあるかチェックする.
- SGAにない場合,バックグラウンドプロセスがデータベースファイルからデータを取り出し,SGAのデータベースバッファキャッシュ上に格納する.
データベースバッファキャッシュ上で変更されたデータは,DBWRプロセスが定期的にデータベースファイルに書き込む.
REDOログバッファ上のデータは,LGWRプロセスが定期的にREDOログファイルに書き込む. LGWRが書き込むタイミングは,ユーザからのコミット要求等となる.
初期化パラメータファイル(init.ora)の中に,SGAのサイズに影響するパラメータがあり,これらを調整することでOracleのパフォーマンスをいくらか改善することが可能となる.
init.oraのパラメータとは,次のものである.
init.oraのSGAに関する設定項目
パラメータ |
意味 |
DB_BLOCK_BUFFERS
|
データベースバッファキャッシュ専用のバッファ数 |
SHARED_POOL_SIZE
|
共有SQL領域に割り当てるバイト数 |
SGAは大きければ大きいほどOracleの処理がオンメモリで行われるため,パフォーマンスよいが,実メモリが足りない場合はページアウトの対象となるので,逆に大きすぎるとパフォーマンスが落ちてしまう(OSがスワップを行うから)というものである.
3.Oracle9iR2での動的SGAの変更(SGA_MAX_SIZE)
- Oracle9iからは,動的にSGAを変更する事が出来るようになった.
- ただし,あらかじめ最大サイズを設定しておかなければならない.
- SGAの最大サイズは,次のパラメータで確認できる.
SQL> connect sys/password as sysdba
接続されました。
SQL> show parameter sga_max_size;
NAME TYPE VALUE
------------------------------------ ----------- --------------------
sga_max_size big integer 269556596
SQL>
|
- この場合,SGAは,最大269556596byte=約257MBまで拡張できる.
- このパラメータのい変更は,再起動が必要となる.
- たとえば,300MBに変更してみる.
SQL> alter system set sga_max_size = 300M scope=spfile
2 ;
システムが変更されました。
SQL>
|
SQL> show parameter sga_max_size
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
sga_max_size big integer 269556596
SQL>
|
- 変更されていない.
- インスタンスをシャットダウンする.
SQL> shutdown immediate
データベースがクローズされました。
データベースがアンマウントされました。
ORACLEインスタンスがシャットダウンされました。
SQL>
|
SQL> startup
ORACLEインスタンスが起動しました。
Total System Global Area 319888364 bytes
Fixed Size 453612 bytes
Variable Size 234881024 bytes
Database Buffers 83886080 bytes
Redo Buffers 667648 bytes
データベースがマウントされました。
データベースがオープンされました。
SQL>
|
4.Oracle9iR2での動的SGAの変更(SHARED_POOL_SIZE)
SQL> show parameters shared_pool_size;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
shared_pool_size big integer 50331648
SQL>
|
- 現在は50,331,648byte=48MBなので,これを60MBに設定してみる.
SQL> alter system set shared_pool_size = 60M;
システムが変更されました。
SQL>
|
SQL> show parameters shared_pool_size;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
shared_pool_size big integer 67108864
SQL>
|
5.Oracle9iR2での動的SGAの変更がいつまで持続するのか?
- コマンドラインで変更した結果は,いつまで持続しているのか確認する.
- データベースを再起動してみる.
SQL> shutdown immediate
データベースがクローズされました。
データベースがアンマウントされました。
ORACLEインスタンスがシャットダウンされました。
SQL> startup
ORACLEインスタンスが起動しました。
Total System Global Area 319888364 bytes
Fixed Size 453612 bytes
Variable Size 234881024 bytes
Database Buffers 83886080 bytes
Redo Buffers 667648 bytes
データベースがマウントされました。
データベースがオープンされました。
SQL>
|
SQL> show parameters shared_pool_size;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
shared_pool_size big integer 67108864
SQL>
|
- 変更した後の値に戻っている.
- scopeオプションをmemoryに設定して,共有メモリを小さく設定してみる.
SQL> alter system set shared_pool_size=40M scope=memory
2 ;
システムが変更されました。
SQL> show parameters shared_pool_size;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
shared_pool_size big integer 41943040
SQL>
|
- 共有メモリを小さく設定できた!
- 再起動して,共有メモリを確認してみる.
SQL> shutdown
データベースがクローズされました。
データベースがアンマウントされました。
ORACLEインスタンスがシャットダウンされました。
SQL> startup
ORACLEインスタンスが起動しました。
Total System Global Area 319888364 bytes
Fixed Size 453612 bytes
Variable Size 234881024 bytes
Database Buffers 83886080 bytes
Redo Buffers 667648 bytes
データベースがマウントされました。
データベースがオープンされました。
SQL> show parameters shared_pool_size;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
shared_pool_size big integer 67108864
SQL>
|
- 変更前の64MBに戻っている.
- つまり,先ほどの設定はmemory上で反映されただけで,init.oraファイルには変更が反映されていない.
- scopeを設定しない場合(つまりデフォルト時)の動作は,暗黙的に次のようなscopeが指定されている.
alter system set shared_pool_size 40M scope=spfile; |