津島博士クイズ大会の応募は締め切りました。多数のご応募・ご回答ありがとうございました!
第2弾も予定しておりますので、是非チャレンジしてください。
本ページにて解答を発表します。質問の後に解答が続きますので、答え合わせしてみて下さい。
【津島博士クイズと解答】
パフォーマンスに関するメモリ・チューニング、オプティマイザ、SQL/実行計画、パーティション/索引、待機イベントについて問題を考えてみました。
全部で10題の質問を出します。 (質問の後ろに解答が続きます。)
【1】メモリ・チューニングを簡単にするために、Oracle Database 11gから提供されたのが自動メモリ管理(MEMORY_TARGET)ですが、これを使用しても実行されないものがあります。その実行されないものを以下の中から選びなさい(すべて選びなさい)。
A.DB_CACHE_SIZEを調整する
B.LOG_BUFFERを調整する
C.SHARED_POOL_SIZEを調整する
D.DB_nK_CACHE_SIZEを調整する
E.共有プールで存続期間によるサブプール分割を行う
F.PGAを調整する
【2】オプティマイザ統計の収集を簡単にするために、Oracle Database 10から提供されたのが自動オプティマイザ統計収集ですが、デフォルトで収集されないものがあります。その収集されないものを以下の中から選びなさい(すべて選びなさい)。
A.システム統計
B.列統計
C.ヒストグラム
D.拡張統計
E.索引統計
F.ディクショナリ
G.固定オブジェクト
【3】大量のデータを高速にフル・スキャンするのに効果的なダイレクト・リードですが、そのダイレクト・リードについての説明で正しいものを以下の中から選びなさい(すべて選びなさい)。
A.パラレル実行では常に動作する
B.シリアル実行では動作しない
C.パラレル実行ではアクセスする表がバッファ・キャッシュの2%より大きいと動作する
D.シリアル実行ではアクセスする表のサイズとバッファ・キャッシュの状態によって動作するかが決まる
E.パーティション・プルーニングしても表全体のサイズがバッファ・キャッシュの2%より大きくないと動作しない
【4】H/Wリソースに余裕があるので、性能アップさせるためにパラレル実行することにしました。ただし、実行すると以下の実行計画のように一部(赤枠のところ)がパラレルで実行しませんでした。その考えられる原因を答えなさい。また、GROUP BYは1回だけしか実行していないのに、実行計画ではHASH GROUP BYが2回実行されています。それに対する説明で正しいものを以下の中から選びなさい(すべて選びなさい)。

(パラレル実行されない理由)
[ ]
(HASH GROUP BYが2回実行される説明について)
A.パラレル実行だと常に2回実行される
B.パラレル実行でGROUP BY列の一意な値が多いと2回実行される
C.パラレル実行でGROUP BY列の重複値が多いと2回実行される
D.集計関数がCOUNTだと常に2回実行される
E.シリアル実行では2回実行されない
【5】以下のような結合しているUPDATE文は、表’tab2’を2回アクセスしてしまい効果的ではありません。そのため、表’tab2’を1回のアクセスにするようにSQLを書き換えることにしました。そのSQLの書き換えで効果があるものを以下の中から選びなさい(すべて選びなさい)。ただし、tab2.c1が主キーで、tab1.c1が外部キーとします。

A.WITH句を使用する
B.結合ビューを作成する
C.索引を作成する
D.MERGE文にする
E.ヒントを使用する
【6】パーティションは、パーティション・プルーニングによって検索性能を向上することができる機能ですが、以下のようにシリアル実行しているSQLに対して、結合列でパーティションしている場合に効果的に動作する処理とは何か答えなさい。表’売上履歴’は、過去5年間のデータを列’売上日付’で月単位のレンジ・パーティションをしているとします。

[ ]
【7】システムを運用していると、ある表にデータが多く挿入されたことで、その表のBツリー索引のアクセスが遅くなってきました。そのため、索引を再構築しましたが、多少の改善はしたが以前のような性能ではありませんでした(このとき全表スキャンでは更に遅くなります)。これを改善するために考えられる対策として以下の中から正しいものを選びなさい(すべて選びなさい)。ただし、アプリケーションは変更したくありません。
A.索引を一度削除してから再作成する
B.表を複数の表に分割して表のデータ量を少なくする
C.パーティション表を作成してアクセスする行数を少なくして全表スキャンにする
D.索引を使用禁止(UNUSABLE)にする
E.索引にパーティションを作成してBツリーの階層を削減する
【8】データの増加により、バッチ処理時間がだんだん遅くなってきました。このままではバッチウィンドウ内で終わらなくなってしまうので、プログラムを分割して並列に実行することにしました。それを実際に実行すると、更新している表の競合で速くなりませんでした。考えられる対策として以下の中から正しいものを選びなさい(すべて選びなさい)。
A.バッファ・キャッシュ・サイズを増やす
B.プログラム分割単位に更新する表を分割する
C.プログラム分割単位に更新する表にパーティションを作成する
D.更新する表に対して表圧縮を行う
E.プログラム分割ではなくパラレル実行を行う
【9】システムが遅いと感じてAWRを見てみたら、Top 5 Timed Eventsのトップに’db file sequential read’が存在していて効果的に動作していません。この待機イベントの原因を調査するために、初めに確認するべき情報としては何が最適でしょうか。その情報を以下の中から一つ選びなさい。
A.Tablespace IO Stats / File IO Statsを確認してアクセスの多いデータ・ファイルを調べる
B.SQL統計を確認してI/Oの多いSQLを調べる
C.バッファ・キャッシュ・ヒット率(Buffer Hit %)を確認する
D.セグメント統計を確認してアクセスの多い表または索引を調べる
【10】システムが遅いと感じてAWRを見てみたら、Top 5 Timed Eventsのトップに’db file scattered read’と’DB CPU’が存在していて効果的に動作していません。これを改善するために以下のA~Fの対策を考えました。それぞれの対策に対する効果の可能性について、以下の①~⑤の中から適切なものを選びなさい。他の待機イベントは、ほとんど発生していないとしたときの効果の可能性について答えなさい。
(対策)
A.アクセスが多い表に索引を作成する ( )
B.アクセスが多い表の索引を削除する ( )
C.アクセスが多い表にパーティションを作成する( )
D.実行時間が長いSQLでパラレル実行を行う ( )
E.バッファ・キャッシュ・サイズを増やす ( )
F.高速なストレージに変える ( )
(効果)
①.効果がない
②.CPU処理とI/O処理が改善なれる
③.I/O処理は改善されるがCPU処理は改善されない
④.CPU処理は改善されるがI/O処理は改善されない
⑤.CPUとストレージの限界になるまで改善される
津島博士クイズ 解答集
【1の解答】
B.LOG_BUFFERを調整する
D.DB_nK_CACHE_SIZEを調整する
【2の解答】
A.システム統計
D.拡張統計
G.固定オブジェクト
【3の解答】
C.パラレル実行ではアクセスする表がバッファ・キャッシュの2%より大きいと動作する
D.シリアル実行ではアクセスする表のサイズとバッファ・キャッシュの状態によって動作するかが決まる
【4の解答】
(パラレル実行されない理由)索引をパーティションしていない
C.パラレル実行でGROUP BY列の重複値が多いと2回実行される
E.シリアル実行では2回実行されない
【5の解答】
B.結合ビューを作成する
D.MERGE文にする
【6の解答】
ブルーム・フィルター(ジョイン・フィルター)
【7の解答】
C.パーティション表を作成してアクセスする行数を少なくして全表スキャンにする
E.索引にパーティションを作成してBツリーの階層を削減する
【8の解答】
B.プログラム分割単位に更新する表を分割する
C.プログラム分割単位に更新する表にパーティションを作成する
E.プログラム分割ではなくパラレル実行を行う
【9の解答】
C.バッファ・キャッシュ・ヒット率(Buffer Hit %)を確認する
【10の解答】
A.アクセスが多い表に索引を作成する(②)
B.アクセスが多い表の索引を削除する(①)
C.アクセスが多い表にパーティションを作成する(②)
D.実行時間が長いSQLでパラレル実行を行う(⑤)
E.バッファ・キャッシュ・サイズを増やす(③)
F.高速なストレージに変える(③)
