ホーム > ライブラリー > Teradata コラム > Teradataデータベースアーキテクチャ概説(6)

丹 隆之
製品企画開発部
これまでに何度かオプティマイザーについて触れてきました。オプティマイザーは、クエリーを実行する際に最もシステムリソースの消費量が少ない実行プランを決定するための最適化ルーチンですが、その判断材料となるのが統計情報です。オプティマイザーは、統計情報の内容を吟味した上で最終的な実行プランを確定します。
今回は、最適なクエリー実行プランを生成するための重要な情報源となる統計情報と、統計情報の収集や保守を手助けしてくれる Teradata Statistics Wizard というユーティリティについて解説します。
自動車や電車である目的地に行くときにさまざまなルートが存在するのと同様
に、クエリーの実行においてもある結果を導き出すのに複数の手順が考えられます。それらの中から一番効率の良い手順を選択するのはオプティマイザーの仕事ですが、さすがのオプティマイザーも何の手がかりも無く最適な実行プランを選択することはできません。クエリーを実行する際に、「インデックスを使うべきか」あるいは「どのようなタイプのジョインを行うべきか」といった判断を下し、最適な実行プランを選択するためには、
(1)テーブルの行数、(2)固有値の数、(3)インデックスはユニークか否か、といった統計情報が必要になります(
イラスト1)。

このように、統計情報とはオプティマイザーにとっての虎の巻であり、最適なクエリー実行プランを策定するための重要な情報源になります。
統計情報には、1つのテーブルの全てのデータから統計情報を収集する「全テーブル統計」と、サンプリングしたデータから統計情報を収集する「サンプル統計」があります。また、これらの統計情報が事前に収集されていない場合は、クエリーの実行時にランダムに選択された AMP でデータをサンプリングし、「ランダムAMP サンプル統計」が収集されます。
「全テーブル統計」の収集にはテーブル全体のスキャンが行われるため、大きなテーブルの場合は業務に影響がないように、実施する時間帯を考慮する必要があります。運用上どうしても「全テーブル統計」を収集する時間が工面できない場合に限って「サンプル統計」を検討してください。サンプリングは短時間で収集できるというメリットがありますが、情報の精度としては劣ってしまいますので、あくまで代替手段として捉えてください。また、統計情報が収集されていない場合に行われる「ランダムAMP サンプル統計」は、AMP のデータ分散が偏っている(※1) 場合は、最善とは言えないプランが生成されてしまう可能性がありますので注意してください。統計情報の種類と特徴については、(表1)を参照してください。

地図や路線図が古いために遠回りをしてしまうことがあるように、統計情報が古くて現実とかけ離れている場合、オプティマイザーは非効率な経路を選択してしまう可能性があります。
「全テーブル統計」か「サンプル統計」が収集されている場合は、たとえ現実と違っていても、常にその情報を頼りに実行プランが作成されます。仮に、テーブルA を作成して、データを 1000件だけ入れた時点でこのテーブルの統計情報を収集したとします。その後、このテーブルに 1億件のデータをロードした場合、統計情報を再収集しないと、実際は 1億件以上のデータがあるにもかかわらず、統計上は 1000件しかデータがないものと見なされ、結果的にこのテーブルを使うクエリーはとんでもないプランで実行されてしまう可能性があります。従って、統計情報は常に最新の状態に保っておくことが大切です。一般的には、該当テーブルにおいて、挿入や削除、または変更された行の割合が 10%を超えた場合は統計情報を再収集すべきです。
それでは、一体どのようなカラムやインデックスに対して統計情報を収集すればよいのでしょうか。基本的には、SQL文の WHERE句で参照されるすべてのカラムや非固有インデックスに対して収集する必要があります。以下の条件を満たすカラムが統計情報の収集対象になります。
統計情報の重要性は十分理解していても、多数あるテーブルの中から統計を収集すべきカラムやインデックスを特定したり、常に最新の状態に保っておくといった運用は手間がかかります。これらの悩みを解消してくれるツールが Teradata Statistics Wizard(TSWIZ)です。TSWIZ は Microsoft Windows 上で稼働する GUI ユーティリティであり、煩雑な統計情報の管理を効率的にサポートしてくれます(図1)。

TSWIZ は、主に以下の機能を提供します。
TSWIZ の分析によって作成された推奨リストを選択することにより、統計情報を即時に収集することも、スケジュールをして後で収集することも可能です。
クエリーを効率よく実行するためには、統計情報の収集と更新が欠かせません。オプティマイザーは、統計情報があるとアグレッシブな実行プランを生成し、ない場合は手堅い控えめな実行プランを作成します。そのため統計情報がきちんと取られているかどうかで、同じクエリーでもパフォーマンスに大きく影響します。一見運用が煩雑そうな統計情報も、TSWIZ というユーティリティを使うことで、比較的容易に管理・運用することができますので是非ご活用ください。
*1: 例えば AMP が 4つあるシステムで、1000行のテーブルが、AMP1〜3 に 100行ずつ格納され、AMP4 に700行格納されている場合、このテーブルのデータ分散は偏っていると言えます。
*2: ジョイン・インデックス(J I)とはジョインのパフォーマンスを改善するために、通常 2つ以上のテーブルを事前にジョインした形で作成する手法。
*3: グローバル・テンポラリー・テーブルとは SQLセッションが存在する間だけ使用できる一時的なテーブルです。テーブルの定義は永続的に保存されますが、データはセッションの終了時に削除されます。
Copyright (C) Teradata Magazine - Vol.11 2006