UJP - 技術情報

Life is fun and easy!

不正IP報告数

Okan Sensor
 
メイン
ログイン
ブログ カテゴリ一覧

     

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> 
  • これで300MBに変更されている事が確認できた.

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> 
  • 64MBになっている.

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;


広告スペース
Google