17.00 - 17.05 - 間隔ヒストグラム - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQLリクエストおよびトランザクション処理

Product
Advanced SQL Engine
Teradata Database
Release Number
17.00
17.05
Published
2020年6月
Content Type
プログラミング リファレンス
ユーザー ガイド
Publication ID
B035-1142-170K-JPN
Language
日本語 (日本)

ヒストグラムは、定義されている分離値範囲カテゴリに分類される特定のカテゴリのデータの発生数、つまりカーディナリティ(間隔と呼ばれる)です。

Teradata Databaseで使用する間隔ヒストグラム

Teradata Databaseは、等高間隔ヒストグラムと偏りがある間隔のヒストグラム、および履歴間隔ヒストグラムを使用して、全AMPサンプル統計およびフル テーブル統計のカーディナリティ、その他の統計値、列とインデックスのデモグラフィックを表わします。ヒストグラム内の間隔数が多くなるほど、各間隔ごとに小さいパーセンテージの構成要素を特徴付けることができるため、データの分布をより正確に説明することができます。

Teradata Databaseは、偏りがある間隔と等高間隔、および最大サイズ64KBのBLOBを使用して格納できる履歴レコードの数を決定します。

統計収集時にMAXINTERVALS USINGオプションを指定して、ヒストグラムに使用する間隔数(10~500)を決定できます。 デフォルトの最大値は250です。

統計を格納するときに使用される間隔の数は、相当する列セットに含まれる固有値の数の関数です。例えば、列またはインデックス セットに10の固有値しかない場合、Teradata Databaseは500の間隔にわたってではなく、11の間隔にわたってその列についての統計を格納します(マスター レコードに、セット内の固有値の頻度を含む10の追加の間隔を加えたもの)。

Teradata Databaseが最大間隔数を使用するのは、統計が取り込まれる列またはインデックス セットに含まれる固有値の数が、間隔の最大数に等しいか超えるときのみです。

ヒストグラムに保持されている統計およびデモグラフィック情報は、問合わせのさまざまな属性を見積もるときに使用されますが、そのもっとも重要なものは、リクエストで指定されているリレーションのさまざまな側面のカーディナリティです。

Teradata Databaseはカーディナリティおよび選択性を見積もる際に、派生統計も使用することに注意してください(詳細については、派生統計を参照)。このような統計は間隔ヒストグラムに格納されている初期値に基づいていますが、CHECKおよび参照整合性制約、クエリー述部、ハッシュ インデックスおよび結合インデックスのような追加情報を組み込むことにより、クエリーの最適化の各段階でその正確性が調整されます。

詳細は、派生統計を参照してください。

間隔ヒストグラム統計の新しさ

間隔ヒストグラムに含まれる統計は、その性質上、データが変更されるとすぐに古いデータになります。

Teradataの問合わせ最適化ルーチンは、最適化のさまざまな段階で、派生統計を使用して問合わせのカーディナリティ見積もりに対する最悪の場合発生し得るエラーを減少させます(派生統計を参照)。また、統計収集用にいくつかのしきい値とサンプリング オプションが用意されているので、最新の情報に更新する必要のない統計の再収集を避けることができます。

詳細については、<Teradata Vantage™ - SQLデータ定義言語-構文規則および例、B035-1144>の「COLLECT STATISTICS (最適化ルーチン形式)」を参照してください。

間隔ヒストグラムの用語

Teradata Databaseによって使用される間隔とヒストグラムの説明に使用される用語は、次のテーブルのように定義されます。

用語 定義
カーディナリティ 述部条件を満たすAMP当たりの行数。

この文脈では、カーディナリティはテーブル全体の行数ではなく、述部条件を満たす行数であることに注意してください。この文脈でのカーディナリティの意味についての詳細は、初期カーディナリティを見積もるための間隔ヒストグラムの使用を参照してください。

合成間隔ヒストグラム 等高間隔と偏りのある間隔の両方、または偏りのある間隔のみをマスター レコードと組み合わせたヒストグラム。
等高間隔 間隔番号の関数としての行数の分布グラフが平坦になるよう、分布全体にわたって正規化された列統計が含まれる間隔。

等高間隔は、各間隔に含まれる行の数が同じになるよう(ただし、属性値の範囲は異なります)各間隔の幅を調整することによって得られます。 等高間隔には、孤立値またはNULLとその頻度は含まれません。

等高間隔は、等深間隔と呼ぶこともあります。

等高間隔の一部のフィールドの定義を、次のリストに示します。
  • 値は、間隔に含まれる非最頻数値の総数になります。

    等高間隔が単一の値を表わす場合、その値は最頻値(Mode Value)として保存されます。Teradata Databaseは非最頻数値の総数となる値の数を、この場合は0に設定します。

  • 最頻値は、間隔に含まれる最高頻度の値になります。
  • 最頻度数は、最頻値を保持する行の数になります。
  • 最大値は、間隔でカバーされる最大値になります。
  • 行数は、間隔に含まれる非最頻数値の行の総数になります。
等高間隔ヒストグラム 順序付けられた等高間隔の配列によって特徴付けられるヒストグラム。

等深間隔ヒストグラムともいいます。

偏りのある間隔 ひずみのある列の非NULL値を特徴付けるために使用される間隔(孤立値)。

ひずみがかなり大きい値は、偏りのある間隔ごとに要約されます。孤立値を参照してください。

偏りのある間隔の一部のフィールドの定義を、次のリストに示します。
  • 間隔の孤立値。
  • 孤立値を持つ行の数。
偏りのある間隔ヒストグラム 順序付けられた孤立値の偏りのある間隔の配列によって特徴付けられるヒストグラム。
ヒストグラム 決められた間隔幅1つ当たりの要素数の関数として分布を表示するための手段。

ヒストグラムは、しばしば棒グラフとも呼ばれます。ヒストグラム中の各バーは、定義されている間隔に対応する行数を表わします。

リレーショナル クエリー最適化理論においてこの用語は、データ ディクショナリ テーブルまたはシステム カタログの中の行のうち、1つの列セットについての属性値の頻度分布を特徴付けるために使用される特定の間隔が格納される行を記述するのに使用されます。

この項で説明するヒストグラムはすべて、度数ヒストグラムです。度数ヒストグラム中の各間隔には、属性値がそれに対応する範囲に属している行の数を表わすフィールドが含まれます。

履歴レコード MinValue、MaxValue、HighModeValue、およびHighModeFrequencyなどの統計を含むヒストグラムに関する履歴情報とその他の関連履歴データを含む間隔。

統計を再収集すると、Teradata Databaseは前のヒストグラムからのサマリー情報を、履歴レコードとして新しいヒストグラムに保存します。Teradata Databaseは、傾向分析に基づいて、ヒストグラムで保持する履歴レコードの数を決定します。履歴レコードが不要になると、システムはレコードを除去します。

間隔 区切られた、重複のない属性値頻度のセット。

ビンまたはバケットと呼ぶことがあります。

孤立値、または偏りのある値 孤立値は、度数の高い非NULL値です。度数の高い値は、大きなスキューが発生する可能性があります。

孤立と見なされるには、値が次の条件を満たす必要があります。



説明
  • fは、値の頻度を定義します。
  • Tは、リレーションのカーディナリティを定義します。

Teradata Databaseは、最大サイズ(64KB)に基づいてヒストグラムに格納できる偏りのある間隔と等高間隔の数を決定しますが、履歴レコード用の領域を残しておきます。

マスター レコード DBC.StatsTbl内の行でStatsId列の値が0の行。これは、各ソース列またはインデックス統計セット内で統計識別子として機能します。

最適化ルーチンは、各列またはインデックスのセットのマスター レコードを使用して、カーディナリティ、平均行サイズ、動的AMPサンプル見積もり、およびその他のオブジェクト レベル属性を維持します。

列またはインデックス セットの統計が収集または更新されるたびに、Teradata Databaseはソースのマスター レコードを更新して、最新のオブジェクト レベルの統計情報を反映します。

列セットに関する統計が更新されると、最適化ルーチンがUDIカウントをリセットします。さまざまな時間にさまざまな統計を収集できるため、削除カウントと挿入カウントの最新ログがTeradata Databaseによってリセットされる前にマスター レコードに保持されます。UPDカウントは個々の列統計のレベルで保持されます。個々の列統計は、マスター レコードの削除カウントおよび挿入カウントと列統計レベルのUPDカウントのどちらかまたはその両方と、DBC.ObjectUsageからの最新のシステムUDIカウントを参照して、特定の統計に関する有効な全体UDIカウントを決定します。

スキュー 属性値の集合またはその頻度の分布の非対称度を示す尺度。
並列データベースでのスキューについては、いくつかの考えられるタイプがあります。
  • 属性値スキューは、データ本来の性質によるスキューを指します。1つの例として、TRUEまたはFALSEのような2種類の値しか取らない列があります。
  • パーティション スキューは、AMP間でのデータの不均等な分配の結果としてのスキューを指します。

違いは、コンテキストから明らかです。このマニュアルでこの語が使用される場合は、通常、パーティション スキューのことを指します。

スキューは、システムがその行を分散する方法または中間結果を使用した方法のために、NoPIとともに見られることが多くあります。

最適化ルーチンが、スキューが発生したテーブルに対する等価結合の実行時にスキューを処理する方法については、等価結合条件に基づいてひずみのあるテーブルを結合するための戦略を参照してください。

Teradata Databaseで使用する間隔ヒストグラムのタイプ

列またはインデックス セット内での値の分布(スキューの程度と呼ぶこともあります)に応じて、4種類のヒストグラム タイプの任意の1つが使用され、統計を表わすことができます。
  • 等高間隔ヒストグラム

    等高間隔ヒストグラムは、さまざまな問合わせにおいて、等幅間隔ヒストグラムよりも最悪のケースが少なく、平均エラーも少なくなります。

    列セットの統計情報は、列の値の度数分布にひずみがなければ、等高間隔ヒストグラムとして表現されます。

    Teradata Databaseは、格納できる偏りのある間隔と等高間隔の数を決定しますが、履歴レコード用の領域を残しておきます。

    等高間隔ヒストグラムでは、各間隔が、値の範囲を含むほぼ同数の行を表わし、縦座標、カーディナリティ、ほとんど定数値または高さを構成しています。1つの行に、既に1つの間隔で表わされている列の値がある場合、それはその間隔でカウントされ、一部の間隔は他より多くの行を表わす場合があります。

    例えば、テーブル内に約250万の行があるとします。間隔ヒストグラムが250の場合、各間隔に約10,000行が割り当てられることになります。

    ある特定の間隔で、Teradata Databaseが9,900行の値を処理し、次の値が300行あるとします。これらの行はこの間隔内でカウントされ、間隔のカーディナリティは10,200になります。または、行は次の間隔でカウントされる可能性があるため、この間隔は9,900行のみを表わします。

    COLLECT STATISTICSリクエストは、各範囲にほぼ同数の行が含まれるように、値の範囲内で行を分割しますが、同じ値がある行を間隔全体に渡って分割することはありません。カーディナリティを一定の間隔に配置するには、間隔の幅または値の範囲を調整する必要があります。

    ヒストグラムに250の等高間隔があると、各間隔は、ヒストグラムが表わす属性値の集団の事実上0.40%を表わすことになります。

    次の図は、等高間隔ヒストグラムの概念を示しています。等高間隔あたりの行数は、実際にはほぼ等しいというだけで、ヒストグラム内の等高間隔の高さがすべて等しいというわけではないことに注意してください。


    等高間隔ヒストグラム

  • 偏りのある間隔ヒストグラム

    偏りのある間隔は、値の度数分布に大きなひずみがある場合にのみ、列またはインデックス セットを表わす際に使用されます。最適化ルーチンでは、純粋な偏りのある間隔ヒストグラムが維持されません。列またはインデックス セットの一部の値が大幅にスキューされている場合は、合成ヒストグラム内に偏りのある間隔と等高間隔が混在します。

    偏りのある間隔ヒストグラムでは、偏りのある各間隔に値と頻度が1つずつのみ含まれます。

  • 合成ヒストグラム

    合成ヒストグラムには、等高間隔および偏りのある間隔が混在し、さらにマスター レコードが格納されます。

    合成ヒストグラムは、純粋な等高ヒストグラムが改良されたものです。これは、データの最大値についての正確な統計を提供します。合成ヒストグラムは、結合されるリレーション内の最大値を比較する結合見積もりに便利です。

    合成ヒストグラムでは、偏りのある間隔が常に等高間隔より優先されます。

    次の図に、201の間隔を持つ合成ヒストグラムの概念を示します。等高間隔あたりの行数は、実際にはほぼ等しいというだけで、合成ヒストグラム内の等高間隔の高さがすべて等しいというわけではないことに注意してください。

    この例の合成間隔ヒストグラムでは、最初の3つの間隔で3つの孤立値を定義し、最後のいくつかで履歴間隔を定義しています。


    合成間隔ヒストグラム

  • 履歴レコード

    履歴レコードは、ヒストグラムの記録を保管します。統計を再収集すると、Teradata Databaseは前のヒストグラムからのサマリー情報を、履歴間隔として新しいヒストグラムに保存します。システムは、傾向分析に基づいて、履歴間隔数を決定します。Teradata Databaseは、不要になった履歴間隔を除去します。

    履歴間隔には、MinValue、MaxValue、HighModeValue、HighMode頻度、およびいくつかの追加データが含まれます。

    各ヒストグラムに保持される履歴間隔数は、次の3つの条件に基づいて決まります。
    • 履歴間隔の重要度。

      保持または除去する履歴レコード数は、その重要度によって決まります。

      履歴間隔の重要度は、最新の傾向分析で、間隔の関与の重要性によって決まります。履歴間隔の重要度がユーザー定義またはシステム定義のしきい値より低い場合、Teradata Databaseはそれをヒストグラムから除去します。

      履歴レコードの重要度は、履歴間隔からのNumRow、UV、AllNull、NumNull、MinVal、およびMaxValなどの統計値の重要度に基づいて計算されます。単一の統計値の重要度は、次のルールに従って決まります。
      • Teradata Databaseが最新の傾向分析で統計値を使用しない場合、重要度は0です。
      • 重要度値が最近の傾向分析に関与していない場合、重要度は、統計値がある場合とない場合の信頼度の絶対差に比例します。
    • 履歴レコードの最小数は、Teradata Databaseではデフォルトで10に設定されていますが、重要と判断されて保持する履歴間隔の最小数を表わします。このデフォルトが選択された理由は、必要な信頼性要因の値が0.9を超えるようにするには、履歴間隔が少なくとも10個必要だからです。
    • 履歴レコードの最大数は、Teradata Databaseではデフォルトで20に設定されていますが、重要と判断される履歴間隔の最大数を表わします。このデフォルトは最小値の2倍になっていますが、どのような傾向分析に対してもこれで十分です。

ヒストグラムの内容とストレージ

インデックスと列のヒストグラムは、BLOBとしてDBC.StatsTblHistogram列に格納されます。 この列にはBLOBデータ型があります。

各ヒストグラムの行は、次のカテゴリに分かれます。
  • null
  • 孤立値
  • 非孤立値
ヒストグラムは、次のいずれのタイプの間隔に、マスター レコードを追加して構成されることを思い出してください。
  • 499の偏りのある(孤立値)間隔と1つの等高間隔
  • 等高(非孤立)間隔ヒストグラムと呼ばれる、すべての等高間隔。
  • 合成ヒストグラムと呼ばれる、偏りのある間隔、履歴間隔および等高間隔の組み合わせ。

システムはヒストグラム値を行構造に似た形式で格納します。すべての変数データは、ヒストグラムの後方に格納されていき、それぞれのオフセットが間隔バケットに保存されます。可変長の列に対するオフセットを使用するため、ヒストグラム バケットではデータ値サイズは固定です。こうすることで、ヒストグラム バケットを固定サイズにすることができるため、それによってバケットに対してランダムな位置指定が可能になります。

ヒストグラム ヘッダーに保存されている値記述子は、ヒストグラムのデータ値のエンコードおよびデコードに使用します。
  • サマリー統計はヒストグラム ヘッダーに記録されます。

    HELP STATISTICS文を使用して、ヒストグラムのサマリー統計をレポートします。

  • 偏りのある間隔
  • 等高間隔
  • 履歴間隔

SHOW STATISTICS文を使用して、ヒストグラムの詳細統計をレポートします。

Teradata Databaseは、ヒストグラム ヘッダーにある値記述子を使用して、ヒストグラムのデータ値をエンコードおよびデコードします。ヒストグラムが複数の列に作成されると、Teradata Databaseはそれを各構成要素が単一の列を記述している1つの配列として保持します。この配列には、単一の構成要素を使用して単一列統計を格納し、複数の構成要素を使用して複数列統計を格納します。配列の構成要素が可変長データ型の場合、Teradata Databaseはアクセスを容易にするために、その間隔に4バイトのオフセットを格納します。固定長タイプの場合、実際のデータを間隔に保存します。すべての変数オフセットが最初に保存され、その後に固定タイプのデータが保存されます。

ヒストグラム ヘッダーには、すべてのサマリー情報と、間隔バケットをエンコードおよびデコードするための情報が含まれています。ヒストグラム バケットの全体的な構造は、次のとおりです。データは、示した順に格納されています。

  1. 偏りのある値[(value_1), (value_2) …]
  2. 偏りのある値の頻度
  3. 等高値[(Max, Mode) …]
  4. 等高バケット カウント[(modal frequency, other Vals, other rows) …]
  5. 履歴レコード値[(Min, Max, HighMode, HighModeFreq) …]
  6. 履歴レコード バケット カウント[(OptHistoryIntervalDataType) …]
  7. 可変長列のデータ値

    Teradata Databaseは、対応する可変長列へのオフセットをヒストグラム バケットに格納します。

Teradata Database間隔ヒストグラムのヒストグラムには、次の3つのタイプがあります。偏りのある間隔、等高間隔、および履歴間隔です。また、合成ヒストグラム タイプもあります。このヒストグラムには、等高間隔と偏りのある間隔とが混在します。

ヒストグラム内の各バケットへのオフセットは、ヒストグラム ヘッダーに保存されているベース オフセットから計算されます。
  • 偏りのある間隔

    偏りのある間隔は、値の度数分布に大きなひずみがある場合にのみ、列またはインデックス セットを表わす際に使用されます。

    Teradata Databaseは、孤立値とそれに対応する偏りのある間隔の頻度を、次の全般的な構造で保存します。

    統計 説明
    孤立値 間隔に格納された孤立値。
    孤立値の頻度 この孤立値を保持する行数。
  • 等高間隔

    それぞれの等高間隔には、間隔の最頻値と、その値の頻度、間隔内の最頻数値以外の値の数、最頻度数を持たない間隔内のその他の行数、および、その他の値の中の最小の頻度が含まれています。Teradata Databaseは最小の頻度を使用して、さまざまな見積もりの標準偏差を決定します。

    最頻値は値記述子に基づいて保存されます。頻度とその他の値/行は、次の全般的な構造で保存されます。

    統計 説明
    最頻度数 間隔に含まれる最頻数値の出現頻度。
    その他の値 間隔に含まれる非最頻数値のカーディナリティ。
    その他の行 頻度度数を持たない行のカーディナリティ。
    最低頻度 間隔に含まれるその他の(非最頻数)値の最低頻度。
  • 合成ヒストグラム

    合成ヒストグラムは、等高間隔と偏りのある間隔の組み合わせを格納します。合成ヒストグラムは、純粋な等高ヒストグラムが改良されたものです。これは、データの最大頻度値についての正確な統計を提供します。合成ヒストグラムは、結合されるリレーション内の最大値を比較する結合見積もりに便利です。

  • 履歴レコード

    この間隔タイプでは、ヒストグラムの履歴を記録します。統計を再収集すると、Teradata Databaseは前のヒストグラムからのサマリー情報を、履歴間隔としてヒストグラムに保存します。

    Teradata Databaseは、線形傾向分析に基づいて、履歴間隔数をいくつ保持するかを決定し、不要になると履歴レコードを除去します。

    履歴レコードの全般的な構造は次のとおりです。

    統計 説明
    ANSIタイムスタンプ 統計収集のタイムスタンプ。
    偏りのある(孤立)値の数 ヒストグラム内の偏りのある値(孤立値)の数。
    等高間隔の数 ヒストグラムに含まれる等高間隔の数。
    使用タイプ 収集された統計がサマリーか詳細かの説明。
    サンプリング パーセンテージ サンプリングで収集された統計の場合、使用したサンプリング パーセンテージを示します。
    サンプリング判断 統計の収集にサンプリングが使用された場合、サンプリングがシステムの判断によるものか、ユーザーの判断によるものかを示します。
    等高間隔の偏差 ヒストグラムに含まれる等高間隔内での値の頻度の偏差。
    nullの数 ヒストグラムに含まれる部分的にnullの行数。
    全nullの数 ヒストグラムに含まれる全nullの行数。
    高頻度数 ヒストグラムに含まれる最も高い最頻数値の出現頻度。
    値の数 ヒストグラムに含まれる固有値の数。
    行数 ヒストグラムの行数。
    CPUコスト ヒストグラムの統計の収集に消費したCPU時間を示します。
    I/Oコスト ヒストグラムの統計の収集に消費した入出力時間を示します。
    なし 将来の使用に備えて予約済み。
    なし 将来の使用に備えて予約済み。

格納される統計のデータ型

Teradata Databaseは、列に固有のデータ型を使用してすべての統計を格納します。そのため、精度の低下や切捨ての問題、あるいは、格納されている値のデータ型によって引き起こされる過大なヒストグラムなどの問題はありません。