Oracle Database 11g Release 2に関する10の重要なこと – askTom Live -
Point9: Parallel Improved 【並列処理の改善】
オラクル・コーポレーション
サーバー・テクノロジー部門 シニア・テクニカル・アーキテクト兼エバンジェリスト
Thomas(Tom) Kyte (トム・カイト)
( 目次 )
9.Parallel Improved 【並列処理の改善】
並列処理機能を備えた初のOracleデータベースであるOracle7(7.1.6)が登場したのは1994年で、私がオラクルに入社した翌年のことです。
当時の「大型データベース・サーバー」は、2または4CPUで、メモリは64~128MB(GBではありません)でした。CPUもメモリもわずかで、多くのディスクが必要でした。
ですから、並列処理のアルゴリズムは、少ないメモリで多くのディスクをもつマシンのために考案されたもので、ディスクアクセスにフォーカスされていました。
それが今では、256GBものメモリを積んだマシンが当たり前になっています。
これに対し、アルゴリズムのほうはこうした変化に追いついていませんでした。
しかし、それも大きな変化を遂げました。
Oracle Database 11g R2では、並列処理について3つの大幅な改善が加えられたのです。
1つ目は、CPUの適正利用です。
昔は2つか4つしかなかったCPUが、現在のマシンには64もしくは128コアもあります。オラクルは、これらのCPUを効率よくインテリジェントに活用したいと考えました。
以前は、DBAが表を見て最適な並列度を決める必要がありました。ある表に対していくつの読込みを同時処理すべきかを、表を見ただけで判断しなければならなかったのです。
ある処理における正しい並列度は、32だったり、16だったり、1や128が最適な場合もあります。1つの表について、あらゆるケースで最適な唯一の並列度があるわけではありません。そのため、並列度のチューニングはDBAにとって非常に難しい仕事でした。
Oracle Database 11g R2では、これが全面的に変わりました。
画像クリックで拡大します
SQL文が入力されると、まず並列処理をおこなわない実行プランが作られます。並列処理なしでその問合せを実行するのに、どれくらい時間がかかるかを予想するのです。DBAは、あらかじめ処理時間のしきい値を設定しておき、予想される処理時間がその値よりも短ければ、並列度1、つまり並列処理なしで順次実行されます。
一方、予想時間がしきい値を上回る場合には、並列処理のプランが作られます。並列度は、問合せと表の両方をもとに決められます。以前のように、表のサイズだけで決めるのではありません。また、対象の表だけでなく、その近隣にある表も考慮します。要求された処理全体も含めて判断し、「今回のこの表に対する処理は、並列度16とすべき」などと決めます。
2つ目の改善点は、並列処理文のキューイングです。
過去の並列処理では、誰かが問合せをしたときの並列度が32であれば、32の処理が一度におこなわれました。そして、2人が同時にこの問合せをおこなった場合は64、4人なら128の処理が実行されました。
しかし、64CPUでもない限り、128の処理を同時に実行するとマシンのキャパシティを超え、負荷が上がりすぎてしまいます。CPU使用率は100%になり、何をするのも遅くなります。
Oracle Database 11g R2では、並列処理をおこなう場合はシステム内のCPU数や、現在実行されている処理などを調べ、十分なリソースがあるかどうかを確認するようになりました。
画像クリックで拡大します
その結果、ただちに並列処理を実行しても問題ないと判断された場合は、Oracle Database 11g R1と同じ動作をします。
リソースが足りない場合は、すぐに処理をおこなわず、待ち行列に加えます。リソースに空きが出るまで待つのです。
こうすることで、すべての問合せを同時実行するよりも処理が速くなります。現在実行中の問合せについては、CPUを奪い合うことがないので高速に処理できます。現在待ち行列に並んでいる分については、ただちに処理をおこなってCPUの利用で競合するよりも、少し待ってリソースに空きが出てから処理を開始したほうが、回答を早く返せます。
一度に処理せず待ち行列を使うことで、ユーザーが何十もしくは何百人いても並列処理が可能になるのです。
3つ目の改善点は、並列処理におけるデータへのアクセス方法についての変更です。
さきほど、昔の並列処理は、マシンのメモリがわずかだったためディスクアクセスにフォーカスされていたと述べました。
並列処理は、表全体のフルスキャンを行う時に実行されました。メモリが少ないので、すべての表をメモリに保持することはできません。このため、表のデータの一部がメモリ上にあっても、一度すべてフラッシュして、直接ディスクからI/Oをおこなっていました。並列処理を実行する場合はかならず、何度もディスクから表全体を読み込む作業をおこなっていたのです。
現在は状況がまったく変わり、マシンには大量のメモリが搭載されています。
それに合わせて、並列処理のアルゴリズムも変更されました。
画像クリックで拡大します
問合せがあると、まず表をスキャンして、「大」「中」「小」の3つに分類します。
データが「小」の場合は、とくに変わったことはしません。従来のOracleデータベースと同様に、バッファキャッシュを使います。ディスクからブロックを読み込んでバッファキャッシュに保持し、ここから読み出します。ですから、小さい表での処理では、バッファキャッシュを利用します。
表が大きすぎてメモリに収まらない場合は、以前と同様の方法で処理されます。表のブロックのバッファキャッシュをフラッシュし、ディスクから直接読み込むのです。
改善されたのは「中」の場合です。表がメモリに収まる大きさなら、インメモリ並列処理がおこなわれます。データベースに割り当てられたすべてのメモリを見て、クラスタ構成ではなくシングルインスタンスであれば1つのSGAが、クラスタ環境であれば複数のSGAの一部が利用できます。
たとえば、2台構成のデータベース・システムで各マシンのメモリが256GBだとすれば、インメモリ並列処理には512GBのSGAが使えます。データベースは表を見て、表を2つに分割し、ノード1とノード2が半分ずつメモリに読み込みます。最初の問合せでは物理I/Oが発生しますが、以降はメモリから表をスキャンするだけでよく、物理I/Oは必要ありません。
これにより、メモリに収まるサイズのデータウェアハウス用の表については、問合せに対するレスポンス時間が大幅に改善されます。
これらの改善が加えられた理由としては、マシンのメモリが大幅に増えたこと、システムが非常に複雑化したため並列度を決めるのがひどく難しくなったこと、より多くのCPUを活用したいというニーズが高まったことなどが挙げられます。
▲ ページTOPに戻る
Oracle Database 11g Release 2に関する10の重要なこと – askTom Live - 目次
Copyright © 2010, Oracle Corporation Japan. All rights reserved.
無断転載を禁ず
|
この文書はあくまでも参考資料であり、掲載されている情報は予告なしに変更されることがあります。日本オラクル社は本書の内容に関していかなる保証もいたしません。また、本書の内容に関連したいかなる損害についても責任を負いかねます。
Oracleは米国Oracle Corporationの登録商標です。文中に参照されている各製品名及びサービス名は米国Oracle Corporationの商標または登録商標です。その他の製品名及びサービス名はそれぞれの所有者の商標または登録商標の可能性があります。 |
Thomas(Tom) Kyte (トム・カイト)
2000年にAsk Tomブログ( http://asktom.oracle.com ) を開設して以来10年にわたり、全世界のオラクル技術者のありとあらゆる質問に答え、データベース技術の活用を世に広めてきた世界的に有名なエバンジェリスト。
|