連載
» 2004年12月08日 00時00分 公開

SQLを分析する高度なテクニックDB2チューニング・ベストプラクティス(6)(3/4 ページ)

[Fraser McArthur,DB2 Enablement Consultant/IBM Canada Ltd.]

アクセス・プランのExplain

 SQL Explain機能はSQLコンパイラの機能の一部であり、ステートメントのアクセス・プラン、およびステートメントがコンパイルされた環境を表示するために使われます。Explainの情報は、いくつかの方法で収集および表示することができます。

 Explainの情報は、以下を行うために役立ちます。

  • 照会のために選択された実行プランを理解する
  • アプリケーション・プログラムを設計する
  • アプリケーションをいつ再バインドすべきかを決定する
  • データベースを設計する

 SQLステートメントのExplainデータを取得するには、Explain機能を呼び出す許可IDと同じスキーマを使用して、事前にExplain表を定義しておく必要があります。Explain表のDDLについては、DB2のインストール・ディレクトリの「sqllib/misc/explain.ddl」または「sqllib\misc\explain.ddl」を参照してください。

 Explain表を消去するには、次のステートメントを実行します。

delete from schema.explain_instance
(注:赤字は各自の環境に置き換えてください)

 このほかのExplain表は、カスケード削除の参照保全により、結果的にすべて消去されます。

 Explainの出力結果を分析する場合は、以下の点について調べます。

  • 同じ基本表の同じ列の集まりに対してORDER BY、GROUP BY、DISTINCTのいずれかの演算子が繰り返し使われている場合は、索引またはMQT(Materialized Query Table:マテリアライズ照会表)を使用することで、ソートを排除できます。

  • 大規模なソート、ソート・オーバーフローの発生、表の頻繁な使用など、コストのかかる操作が行われている場合は、ソート・スペースの拡大、より適切な索引の使用、統計の更新、または異なるSQLの使用によりパフォーマンスを改善できます。

  • 表スキャンが行われている場合は、索引を使用することでパフォーマンスを改善できます。

  • 開始キーおよび停止キーを使用しない全索引スキャン、または使用する開始キーおよび停止キーの値の範囲が広い、選択性の低い索引スキャンが行われているかどうか。

  • 単一列のフェッチが行われている場合は、INCLUDE索引を使用することで回避できます。

Visual Explain

 Visual Explainは、とても簡単で、使いやすいツールです。Visual Explainは、パラメータ・マーカー(「?」で表されます)を含んでいるステートメントのExplainを行うことができます。ただし、GUIベースであるため、結果をほかのユーザーと共有することは困難です。「コントロール・センター」で、SQLステートメントのExplainを行いたいデータベースを右クリックして、「SQLのEXPLAIN...」を選択します。SQLテキスト・ボックスの中にSQLステートメントを入力して「OK」をクリックすると、グラフが生成されます。図1はグラフの表示例を示しています。

図1 Visual Explainの結果画面 図1 Visual Explainの結果画面

 任意のノードをダブルクリックすると詳細な分析結果が得られます。

テキスト・ベースのExplain

 テキスト・ベースのdb2exfmtとdb2explnは、(最初は)あまり読みやすいものではありませんが、出力ファイルを簡単に送信できるため、結果をほかのユーザーと容易に共有できます。

 新しいデータを収集する前に、次のステートメントを実行してExplain表を消去しておきます。

delete from schema.explain_instance
(注:赤字は各自の環境に置き換えてください)

 このほかのExplain表は、カスケード削除の参照保全により、結果的にすべて消去されます。

 (Visual Explainも含めて)すべてのExplainの出力結果は、下から上へと読みます。

図2 テキストExplainの出力結果 図2 テキストExplainの出力結果

 Visual Explainのように複数の画面に詳細が表示されるのではなく、単一のファイルにすべての詳細が出力されます。図2では、それぞれの演算子に番号が付けられており、ドキュメントの下の方に行くと、それぞれの演算子について詳しく説明されています。上の図では、演算子は次のように解釈できます。

表示項目 意味
60.16 戻される行数(統計計算に基づく)
HSJOIN 演算子の種類(ハッシュ結合)
(   2) 演算子の番号
75.1017 累積タイマーオン(コスト)
3 入出力コスト
表1 テキストExplainの演算子の解釈(図2の赤丸部分)

 戻される行数、タイマーオン(timeron:コストを表すIBM独自の単位)、入出力コストはすべてオプティマイザの見積もりであり、実際の数値とは大きく異なる場合もあります。タイマーオンはDB2での測定単位であり、データベース・サーバが同じ照会に対して2つのプランを実行するのに必要なリソース、つまりコストの相対的な見積もりを得るために使用されます。見積もりの中で計算されるリソースには、重み付けされたプロセッサ・コストおよび入出力コストが含まれます。

 db2exfmtを使用すると、単一ステートメントのExplainを行うことができます。例えば、次のように使います。

explain all for SQL_statement
db2exfmt -d dbname -g tic -e explaintableschema -n % -s %
-w -1 -# 0 -o outfile
リスト4 単一ステートメントについてのテキストExplain出力の生成
(注:記号は表示の都合で折り返していることを表します。赤字は各自の環境に置き換えてください)  

 複数の「explain all…」ステートメントを「;」で区切ったテキスト・ファイルを作成すると、複数のステートメントのExplainを一度に行うことができます。

db2 -tf file_with_statements
db2exfmt -d dbname -g tic -e explaintableschema -n % -s %
-w % -# 0 -o outfile
リスト5 複数ステートメントについてのテキストExplain出力の生成
(注:記号は表示の都合で折り返していることを表します。赤字は各自の環境に置き換えてください)   

 パッケージに含まれている静的SQLのExplainを行いたい場合は、db2explnツールを使用する必要があります。

db2expln -database dbname -schema schema_name
-package package -output outfile.txt
(注:記号は表示の都合で折り返していることを表します。赤字は各自の環境に置き換えてください)   

  • チューニング→データベース・システム→データベース・パフォーマンスのチューニング→SQL Explain機能

  • チューニング→データベース・システム→データベース・パフォーマンスのチューニング→SQL Explain機能→Explain情報の収集と分析のためのツール→Visual Explain

次ページに続く)

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。