17.10 - キュー テーブル キャッシュ - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQLデータ定義言語 詳細トピック

Product
Advanced SQL Engine
Teradata Database
Release Number
17.10
Release Date
2021年7月
Content Type
プログラミング リファレンス
Publication ID
B035-1184-171K-JPN
Language
日本語 (日本)

データベースは、キュー テーブルごとにいくつかの非CONSUME行に関する行情報を保持するキャッシュを保守します。システムはこのキュー テーブル キャッシュをシステム始動時に作成し、そのキャッシュは独自のディスパッチャ区画に常駐することになります。システム内の各PEに、キュー テーブル キャッシュのタスクが存在することがあります。

キャッシュ行項目は、そのPEにハッシュするすべてのキューによって共有されます。各キュー テーブルの行項目は、キューから消費されてQITS値の順にソートされる各行のQITSとrowID値の対です。特定のキュー テーブルの項目は、システム上の1つのキュー テーブル キャッシュにだけ存在します。どのシステムPEをアクティブなキュー テーブルに割り当てるかは、ディスパッチャ(<Teradata Vantage™- SQLリクエストおよびトランザクション処理、B035-1142>を参照)パーティション内で以下のアルゴリズムを使用してテーブルIDをハッシュすることにより決定されます。


キュー テーブルのIDハッシュ アルゴリズム

説明

構文の要素 指定内容
queue_table_cache_PE_number 指定のキュー テーブル項目が割り当てられる、キュー テーブルキャッシュを含むPEの構成マップ配列内での位置番号。
tableID[1] ダブル ワードtableID値の2番目のワードの数値(1番目のワードはtableID[0]と記述する)。
MOD 剰余関数。
number_system_PEs システム構成内でのPEの数。

たとえば、システムに6つのオンラインPEがあり、tableID[1]の値は34とします。


""

この値は、位置0から数えて、システム保守のオンラインPEの構成マップ配列における5番目の位置を示します。計算の結果、システムはこのキュー テーブルの項目をシステム構成マップにリストされた5番目のオンラインPEのキャッシュに割り当てます。そのPEがオフラインになると、システムはキュー テーブルを構成マップでの最初のオンラインPEに再割当てします。

データベースは起動時に64 KBを各PE上のキュー テーブル キャッシュに割り振り、必要に応じてPEごとにそのサイズを64 KBずつ最大1 MBまで動的に拡張します。システムは起動時に、キャッシュ内のすべてのフィールドを初期化して、100のテーブル項目のための領域を割り振ります。キュー テーブルがアクティブ化されると、最も小さな番号のスロットから開始して大きな番号のスロットへと、これらのスロットに値を取り込みます。キャッシュ サイズの最大値に到達すると、システムはキャッシュ内に挿入する必要のあるバイト数に応じて、その一部または全部をフラッシュします。

次の定義を想定します。

TotalRow Count = AMP上のキュー テーブルに含まれる未CONSUME行の数

RowCount = PE上のキュー テーブル キャッシュに含まれる行の数

各キュー テーブル キャッシュ項目には、最大で約2,000行の項目があります。他のシステム最大値と同様に、この数値は単独の事例についてのものです。行項目数の実際の限度は、キュー テーブル キャッシュのサイズによって決まります。たとえば、あるテーブルは10の行項目、別のテーブルは100、さらに別のテーブルは1,000といった具合に、限度の1 MBに達するまで行項目を持つことができます。この限度に達すると、システムは項目をキャッシュからフラッシュすることを開始します。しかし個々のテーブルに関しては、一度に約2,000の行項目を持てるものはありません。

最大値に到達すると、システムはTotalRowCount値だけを増分して、新規の行項目はキャッシュに追加しません。

値の関係 結果
TotalRowCount > RowCount キュー テーブルにある行数はキュー テーブル キャッシュにある行数よりも大きい。
RowCount = 0 AND TotalRowCount > 0 システムは行の収集操作を起動して、キュー テーブル キャッシュに値を再度取り込む。
注意するべき点として、テーブルの行項目を消費せずにキャッシュから行の一部または全部を除去する動作をトリガーするイベントに、以下の3つがあります。
  • 最大100のキュー テーブル項目スロットを超過する。

    このイベントにより、サブジェクト テーブルの行項目が部分的に除去されます。システムは、新規の項目を入れる場所を作成するために必要なだけのキャッシュ行項目を除去します。このイベントは、合計キャッシュ サイズが1MB未満の場合にも発生するので、注意が必要です。

  • 最大1 MB (約20,000の行項目)のキュー テーブル キャッシュ サイズ制限を超過する。

    このイベントにより、サブジェクト テーブルの行項目が部分的に除去されます。システムは、新規の項目を入れる場所を作成するために必要なだけのキャッシュ行項目を除去します。このイベントは、使用されているキュー テーブル項目スロットが100未満の場合にも発生するので、注意が必要です。

  • キュー テーブルでのUPDATE、DELETE、またはMERGE操作。

    このイベント カテゴリは、サブジェクト テーブルのすべての項目をキャッシュから除去します。

100のテーブル項目スロットの1つにテーブル項目を挿入する処理は、以下のイベントのどちらかによってトリガーされます。
  • テーブルへの挿入操作。
  • テーブルからの消費操作。

キャッシュがそのPEに対する100のキュー テーブル項目または20,000の合計行項目のどちらかの最大限度に達したときは、次の着信リクエストによってフラッシュが起動されます。

次の表にプロセスを示します。

  1. システムは、破損のマークが付いたキュー テーブル項目のフラッシュを試行します。
    • 破損したキュー テーブル項目がない場合、データベースはキュー内に保留状態のリクエストがないか、または行を収集中のリクエストがないかをチェックします。

      最新の項目が、キューに入っているリクエストの中で保留状態になっているか、または行の収集中である場合、データベースは、リスト内の次に低い項目から始めて、フラッシュする項目を検索します。

      最新の項目が、キューに入っているリクエストの中で保留状態になっておらず、行の収集中でもない場合、データベースはその項目をキャッシュからフラッシュします。

      システム決定のデフォルトQITS値の代わりにユーザー選択のQITS値を使用して行を挿入することによりキュー項目の順序を制御できるため、フラッシュされる項目は実際には最も新しくキューに追加された項目ではないことがあります。キュー テーブルの行の配列を参照してください。

    • 破損したキュー テーブル項目が見つかると、データベースはそれらの項目をフラッシュします。
  2. 適格な項目が見つからない場合、リクエスト元にエラーが返されます。

キュー テーブル キャッシュが最大サイズの1 MB (約20,000の行項目)に到達すると、次に入ってくるリクエストによってフラッシュが起動されます。

そのプロセスは次のとおりです。

  1. システムは、破損のマークが付いたキュー テーブル項目のフラッシュを試行します。
    条件 データベースの動作
    破損したキュー テーブル項目がない 次の操作を実行します。

    各項目を調べて、保留中のキュー内リクエストがあるかどうか、またはそれが行を収集する過程にあるかどうかを判別します。

    上記のとおりに判別された場合、その項目はキャッシュからの除去に適格ではありません。

    適格なキュー テーブル項目ごとのカーディナリティを検索します。

    項目はカーディナリティに基づいてランク付けされます。最大の項目が最初の除去の試行対象となります。

    次に来るリクエストをキャッシュに挿入するために必要な領域の量を計算します。

    最初の適格な項目にある最も新しく追加された行から開始して、そのタイムスタンプ値に基づき、次のリクエストをキュー テーブル キャッシュに挿入するために必要な領域を生成するのに十分な数の行を除去します。

    システム決定のデフォルトQITS値の代わりにユーザー選択のQITS値を使用して行を挿入することによりキュー項目の順序を制御できるため(キュー テーブルの行の配列を参照)、フラッシュされる項目は実際には最も新しくキューに追加された項目ではないことがあります。

    この処理は、次のリクエストを格納するために十分な領域が解放されるまで続きます。

    破損したキュー テーブル項目 フラッシュします。
  2. 適格な項目が見つからない場合、システムはトランザクションをアボートしてリクエスト側にエラーを返します。