この記事では、Oracle に関する関連知識を提供します。主にメモリの割り当てとチューニングに関連する問題を紹介します。Oracle のメモリは、共有とプライベートの観点からシステム グローバルに分割できます。領域とプロセス グローバル領域、つまりSGAとPGAについて一緒に見ていきましょう。
## 推奨チュートリアル: 「Oracle Learning Tutorial」
Oracle のメモリは、共有とプライベートの観点からシステム グローバル領域とプロセス グローバル領域、つまり SGA と PGA (プロセス グローバル領域またはプライベート グローバル領域) に分けることができます。 SGA 領域のメモリはグローバルに共有されます。UNIX では、Oracle はマルチプロセスですが、WINDOWS では Oracle が単一であるため、UNIX では共有メモリ セグメント (1 つ以上の可能性があります) を Oracle に設定する必要があります。プロセス(マルチスレッド)なので、共有メモリセグメントを設定する必要はありません。 PGA はプロセス (スレッド) のプライベート領域です。 Oracle が共有サーバー モード (MTS) を使用する場合、PGA の一部、つまり UGA は共有メモリlarge_pool_size に配置されます。
Oracle メモリ アーキテクチャの図を投稿してください。上の表示によると、主要なパラメータとパラメータ名が一目でわかります:
SGA 部分については、sqlplus のクエリを通して確認できます:
SQL> select * from v$sga; NAME VALUE ---------- -------------------- Fixed Size 454032 Variable Size 109051904 Database Buffers 385875968 Redo Buffers 667648
固定サイズ:
Oracle はプラットフォームやバージョンによって異なる場合がありますが、特定の環境では固定値であり、SGA の各コンポーネントに関する情報が格納されており、SGA の確立をガイドする領域と見なすことができます。 SGA。
可変サイズ:
shared_pool_size、java_pool_size、large_pool_size、およびその他のメモリ設定が含まれます
#データベース バッファ:
はデータ バッファーを指します:8i では、db_block_buffer*db_block_size、buffer_pool_keep、buffer_pool_recycle の 3 つのメモリ部分が含まれます。
9i では、db_cache_size、db_keep_cache_size、db_recycle_cache_size、db_nk_cache_size が含まれます。
やり直しバッファ:
は、ログ バッファ log_buffer を指します。ここでさらに注意すべき点は、v$parameter、v$sgastat、および v$sga のクエリ値が異なる可能性があることです。 v$parameter の値は、ユーザーの最初のを指します。
初期化パラメータ ファイル v$sgastat に設定された値は、Oracle によって実際に割り当てられたログ バッファ サイズです (バッファの割り当て値は実際には離散的であり、ブロックに基づいていないため)最小単位。割り当てられます)、v$sga でクエリされる値は、Oracle がログ バッファを割り当てた後、ログ バッファを保護するために、いくつかの保護ページが設定されるというものです。通常、保護のサイズがわかります。ページは約 11k (環境によって異なる場合があります)。
#2.1 Log_buffer ログバッファのサイズ設定に関しては、LGWR が作成したトリガー条件を参照すると、通常 3M を超えるのはあまり意味がないことがわかるため、通常はあまり多くの提案はないと思います。 。正式なシステムとしては、
最初にこの部分を log_buffer=3-5M サイズに設定してから、特定の状況に応じて調整することを検討してください。 log_buffer は、REDO ログのバッファーです。 したがって、ここで REDO ログのトリガーイベント (LGWR) を理解する必要があります 1. REDO ログバッファの容量が 1/ に達したとき3 2. 設定された REDO ログ書き込み時間間隔 (通常は 3 秒) に達します。 3. REDO ログバッファの REDO ログ容量が 1M に達しました 4. バッファ内のデータを DBWn のデータに書き込みますファイルの前 5. 各コミット - トランザクションを送信します。 上記の結論は別の言葉で表現できます 1. log_buffer の内容は 1/3 いっぱいになり、キャッシュが更新されます一度。 2. 最大間隔は 3 秒で、キャッシュは 1 回更新されます 3. log_buffer 内のデータが 1M に達すると、キャッシュは一度更新されます。 4.「トランザクション」が送信されるたびに、キャッシュが更新されます 2.2 Large_pool_size 大きなバッファ プールの設定については、MTS を使用しない場合は 20 ~ 30M で十分であることをお勧めします。この部分は主に、並列クエリ中に一部の情報を保存するために使用され、バックアップ中に RMAN によって使用される場合があります。
MTS をセットアップする場合、UGA 部分がここに移動するため、この部分のサイズは、サーバー プロセスの数と関連するセッション メモリ パラメーターの設定に基づいて総合的に検討する必要があります。 2.3 Java_pool_size
データベースが JAVA を使用しない場合、通常は 10 ~ 20M を保持すれば十分であると考えられます。実際には、これより少なく、少なくとも 32k になる場合もありますが、データベースをインストールするときのコンポーネント (http サーバーなど) によって異なります。 2.4 Shared_pool_size Shared_pool_size のオーバーヘッドは、通常 300M 以内に維持する必要があります。システムが多数のストアド プロシージャ、関数、およびパッケージを使用しない限り、
たとえば、oracle erp などのアプリケーションは 500M 以上に達する場合があります。したがって、1G メモリを備えたシステムを想定しており、 を検討できます。
#このパラメータを 100M に設定します。2G システムの場合は、150M に設定することを検討してください。8G システムの場合は、200 ~ 300M に設定することを検討してください。 2.5SGA_MAX_SIZE SGA 領域にはさまざまなバッファーとメモリー プールが含まれており、そのほとんどは特定のパラメーターを通じてサイズを指定できます。ただし、高価なリソースであるため、システムの物理メモリ サイズには制限があります。
CPU メモリのアドレッシングでは、実際の物理メモリ サイズに関係する必要はありませんが (これについては後で詳しく説明します)、仮想メモリの過剰な使用はページ イン/アウトにつながります。 ,
はシステムのパフォーマンスに大きな影響を与え、システムのクラッシュを引き起こす可能性もあります。したがって、SGA が使用する仮想メモリの最大サイズを制御するにはパラメータが必要です。このパラメータは SGA_MAX_SIZE です。インスタンスが開始されると、
各メモリ領域には、インスタンスに必要な最小サイズのみが割り当てられます。後続の操作中に、必要に応じてサイズが拡張され、合計サイズは SGA_MAX_SIZE によって制限されます。 OLTP システムについては、 システムを参照してください。メモリ ##SGA_MAX_SIZE 値 #1G ##1G ##4G 2500M #8G 5G 2.6 PRE_PAGE_SGA Oracle インスタンスが起動すると、各メモリ領域の最小サイズのみがロードされます。他の SGA メモリは仮想メモリとしてのみ割り当てられますが、
プロセスが対応するページにアクセスした場合にのみ、物理メモリに置き換えられます。ただし、インスタンスが開始されると、すべての SGA が有効になることを期待できます。
#は物理メモリに割り当てられます。このとき、PRE_PAGE_SGAパラメータを設定することで目的を達成できます。このパラメータのデフォルト値
は FALSE です。つまり、すべての SGA が物理メモリに配置されるわけではありません。 TRUE に設定すると、インスタンスの起動時にすべての SGA が物理に配置されます。
記憶に。これにより、インスタンスが最大のパフォーマンス状態で起動できるようになりますが、起動時間も長くなります (すべての SGA を有効にするため)
は物理メモリに配置され、Oracle プロセスはすべての SGA ページにアクセスする必要があります)。 2.7 LOCK_SGA ページイン/ページアウトせずにSGAが物理メモリにロックされるようにするため、パラメータ LOCK_SGA を通じて制御できます。
このパラメータのデフォルト値は FALSE です。TRUE に指定すると、すべての SGA を物理メモリ内でロックできます。確かに、###
2.8 SGA_TARGET の各メモリ領域
にならない場合があります。
しかし、このような矛盾があります。メモリ リソースが限られている場合、キャッシュされるデータの需要が非常に大きくなる場合があります。 バッファ ヒットを改善するには、バッファ キャッシュを増やす必要があります。ただし、SGA が限られているため、共有キャッシュを減らすなど、他の領域から「奪う」ことしかできません。プール、 バッファ キャッシュを増やします。場合によっては、PLSQL コードの大きなチャンクが解析されてメモリに格納されるため、共有プールが不十分になります。 4031 エラーが発生し、共有プールを拡張する必要がある場合でも、バッファ キャッシュからメモリを取り戻すために人間の介入が必要になる場合があります。 この新機能を使用すると、SGA におけるこのメモリの矛盾が簡単に解決されます。この機能は自動共有メモリ管理と呼ばれます (自動共有メモリ管理 ASMM)。この機能を制御する唯一のパラメータは SGA_TARGE です。 このパラメータを設定した後は、各メモリ領域のサイズを指定する必要はありません。 SGA_TARGET は、SGA が使用できる最大メモリ サイズを指定します ( SGA の各メモリのサイズは Oracle 自体によって制御されるため、手動で指定する必要はありません。 Oracle は、システム システムのパフォーマンスを最適化するための最も合理的なサイズであり、それらの合計が SGA_TARGET で指定された値内に収まるように制御します。 SGA_TARGET (デフォルトは 0、つまり ASMM が開始されていません)、ASMM 機能は自動的に有効になります。 当项目的生产环境出现性能问题,我们如何通过判断那些参数需要调整呢? 3.1 检查ORACLE实例的Library Cache命中率: 标准:一般是大于99%
检查方式: 处理措施:
如果Library cache Hit Ratio的值低于99%,应调高shared_pool_size的大小。通过sqlplus连接数据库执行如下命令,调整shared_pool_size的大小:
3.2 检查ORACLE实例的Data Buffer(数据缓冲区)命中率: 标准:一般是大于90%
检查方式:
处理措施:
如果HIT RATIO的值低于90%,应调高db_cache_size的大小。通过sqlplus连接数据库执行如下命令,
调整db_cache_size的大小
3.3 检查ORACLE实例的Dictionary Cache命中率: 标准:一般是大于95% 检查方式: 处理措施: 如果Data Dictionary Hit Ratio的值低于95%,应调高shared_pool_size的大小。通过sqlplus连接数据库执行如下命令,调整shared_pool_size的大小: 3.4 检查ORACLE实例的Log Buffer命中率: 标准:一般是小于1% 检查方式: 处理措施: 如果Ratio高于1%,应调高log_buffer的大小。通过sqlplus连接数据库执行如下命令,调整log_buffer的大小: 3.5 检查undo_retention: 标准:undo_retention 的值必须大于max(maxquerylen)的值 检查方式: 处理措施: 如果不满足要求,需要调高undo_retention 的值。通过sqlplus 连接数据库执行如下命令,调整undo_retention 的大小: 注:
32bit 和 64bit 的问题
对于 oracle 来说,存在着 32bit 与 64bit 的问题。这个问题影响到的主要是 SGA 的大小。在 32bit 的数据库下,通常 oracle 只能使用不超过 1.7G 的内存,即使我们拥有 12G 的内存,但是我们却只能使用 1.7G,这是一个莫大的遗憾。假如我们安装 64bit 的数据库,我们就可以使用很大的内存,我们几乎不可能达到上限。但是 64bit 的数据库必须安装在 64bit 的操作系统上,可惜目前 windows 上只能安装 32bit 的数据库,我们通过下面的方式可以查看数据库是 32bit 还是 64bit ただし、特定のオペレーティング システムでは、1.7G を超えるメモリ、さらには 2G を超えるメモリを使用できる特定の手段が提供される場合があります。
推奨チュートリアル: 「Oracle チュートリアル 」 以上がOracle 学習のメモリ割り当てとチューニングを要約して整理するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。 #2G##400-500M 三、oracle 内存调优办法
select 1-(sum(reloads)/sum(pins)) "Library cache Hit Ratio" from v$librarycache;
SQL>alter system flush shared_pool;
SQL>alter system set shared_pool_size=设定值 scope=spfile;
select 1 - (phy.value / (cur.value + con.value)) "HIT RATIO"
from v$sysstat cur, v$sysstat con, v$sysstat phy
where cur.name = 'db block gets'
and con.name = 'consistent gets'
and phy.name = 'physical reads';
SQL>alter system set db_cache_size=设定值 scope=spfile
select 1 - (sum(getmisses) / sum(gets)) "Data Dictionary Hit Ratio"
from v$rowcache;
SQL>alter system flush shared_pool;
SQL>alter system set shared_pool_size=设定值 scope=spfile;
select (req.value * 5000) / entries.value "Ratio"
from v$sysstat req, v$sysstat entries
where req.name = 'redo log space requests'
and entries.name = 'redo entries';
SQL>alter system set log_buffer=设定值 scope=spfile;
col undo_retention format a30
select value "undo_retention" from v$parameter where name='undo_retention';
select max(maxquerylen) From v$undostat Where begin_time>sysdate-(1/4);
SQL>alter system set undo_retention= 设定值 scope=spfile;