17.00 - 17.05 - テーブル関数に関する一般的な制限と制約 - Advanced SQL Engine - Teradata Database

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

Product
Advanced SQL Engine
Teradata Database
Release Number
17.00
17.05
Release Date
2020年6月
Content Type
プログラミング リファレンス
Publication ID
B035-1184-170K-JPN
Language
日本語 (日本)
テーブル関数については、次の一般的な制約があります。
  • AMPがダウンしているときは、テーブル関数をフォールバック データに対して実行することはできません。AMPが再稼働すると、クエリーを正常に完了できます。
  • データベースのUDFライブラリに、名前にマルチバイト文字が存在するオブジェクトが含まれている場合、新規オブジェクト名に1バイト文字のみが含まれる場合でも、1バイト セッション文字セットを使用して、新たなUDF、UDT、メソッド、あるいはJava外部プロシージャ オブジェクトを作成することはできません。そうでない場合、Teradata Databaseはリクエスト側にエラーを返します。必ずマルチバイト セッション文字セットを使用するようにしてください。
  • テーブル関数がTeradata Databaseの外部にあるデータにアクセスしたり、OSによるシステム リソースの消費を引き起こしたりする場合は、常に保護モードで実行する必要があります。これには、OSによるシステム コンテキストの割振りを引き起こすものすべて、たとえば、オープン ファイル、パイプ、セマフォー、トークン、スレッド(プロセス)などが含まれます。

    テーブル関数での保護モードのサーバー数をデフォルトの値2から、AMPまたはPE vprocあたり最大20に拡張できます。詳細については、<Teradata Vantage™ - データベース ユーティリティ、B035-1102>および<Teradata Vantage™- SQL外部ルーチン プログラミング、B035-1147>の「cufconfigユーティリティ」を参照してください。最小値は0です。

    保護モードのサーバーで消費されるディスク リソースは次の式によって計算されます。



  • 保護モードで実行されている関数の場合、別のセッションから同時に実行するテーブル関数ごとに少なくとも1つの保護モードのサーバーが必要です。<Teradata Vantage™ - データベース ユーティリティ、B035-1102>および<Teradata Vantage™- SQL外部ルーチン プログラミング、B035-1147>の「cufconfigユーティリティ」を参照してください。テーブル関数はテーブル関数ステップの継続期間中に、vprocあたり1つの保護モードのUDFサーバーを予約します。
  • 構成されている保護モードのサーバーの数が少なすぎる場合、テーブル関数はデッドロックされることがあります。

    システムはこのようなデッドロックの検出も、報告も行ないません。

  • FROM句に複数のテーブルUDFを指定することはできません。
  • FROM ... JOIN ...ON構文を使用して、FROM句結合条件でテーブル関数を呼び出すことはできません。

    以下のテーブルとテーブル関数を作成したとします。

         CREATE TABLE supp_indata (
           a FLOAT,
           b FLOAT;
         CREATE FUNCTION c_mytable (a FLOAT, b FLOAT)
         RETURNS TABLE (c3 FLOAT, c4 FLOAT )
         LANGUAGE C
         NO SQL
         PARAMETER STYLE SQL
         EXTERNAL NAME 'CS!c_mytable!c_mytable.c';

    以下のSELECTリクエストは、FROM ... JOIN ...ON構文を使用するため、有効ではありません。

         SELECT t1.c4
         FROM TABLE (c_mytable(supp_indata.a, supp_indata.b)) AS t1
         JOIN supp_indata AS t2 ON t1.c3 = t2.b;

    ただし、少し異なる構文を使用する以下のSELECTリクエストは有効です。

         SELECT t1.c4
         FROM TABLE(c_mytable(supp_indata.a, supp_indata.b)) AS t1,
                              supp_indata AS t2
         WHERE t1.c3 = t2b;
  • 組み込みSQLアプリケーションからテーブル関数を作成したり置き換えることはできません。
  • テーブル関数は再帰的ビューを参照できません。
  • テーブル関数で返される行のサイズは、システム制限を超えることはできません。

    行がこの制限を超えた場合、システムは、Teradataセッション モードのリクエストまたはANSIセッション モードの含んでいるトランザクションをアボートし、ロールバックを行って、リクエスト側にエラー メッセージを返します。

    関数が実行されるまで、動的結果行で定義されたテーブル関数で制限を超過しているかどうかがわからないため、システムは関数を呼び出すまで、最大行サイズ チェックを先送りします。

  • 任意のテーブル関数で返される列の最大数は2,048です。
  • 保護モードでテーブル関数のインスタンスを実行すると、すべてのインスタンスがtdatuserとして実行されます。
  • Teradata Database外部のコードのトラブルシューティングを行なわなければなりません。

    FNC_Trace_WriteまたはFNC_Trace_Write_DLライブラリ呼び出しを使用して、コードにトレース機能を構築すると、限られた数のコード検査を行なうことができます。CREATE GLOBAL TEMPORARY TRACE TABLEを参照してください。これらのライブラリ呼び出しおよびテーブル関数に構築できるその他のトラブルシューティング方法の詳細については、<Teradata Vantage™- SQL外部ルーチン プログラミング、B035-1147>を参照してください。

  • テーブル関数に入力パラメータとしてTD_ANYTYPEデータ型を指定することができます。
  • テーブル関数に戻りタイプとしてTD_ANYTYPEデータ型を指定することはできません。
  • UDFのRETURN式で参照される非確定要素は、Teradata Unityによって事前定義された値に置き換えることができます。Teradata Unityの詳細については、Teradata Unityのドキュメントを参照してください。
  • BLOBまたはCLOBデータ型を入れる列の指定方法は、データ型をパラメータ列について指定しているのか、それともRETURN TABLE句の列について指定しているのかに応じて異なります。
    LOB型
    パラメータ AS LOCATOR句を使用。
    RETURNS TABLE AS LOCATOR句を使用しない。