すべてのプロダクト
Search
ドキュメントセンター

AnalyticDB:Teradata アプリケーションの AnalyticDB for PostgreSQL への移行

最終更新日:Mar 29, 2026

AnalyticDB for PostgreSQL は Teradata 構文と互換性があります。このガイドでは、Teradata から AnalyticDB for PostgreSQL への移行を計画するために必要な構文の相違点、データ型マッピング、および同等機能について説明します。

移行要件

Teradata から AnalyticDB for PostgreSQL への移行を成功させるには、以下の目標を達成するように設計されています。

  • データウェアハウスの基盤となるデータプラットフォームの完全な移行を実行します。

  • データウェアハウスシステムにデプロイされたアプリケーションのスムーズな移行を実行します。

  • ビジネスユーザーが認識しないビジネスプラットフォームとデータの移行を実行します。

  • 移行後のデータウェアハウスの良好なパフォーマンスを確保します。

  • 適切な移行期間と移行計画を設定します。

  • 元のシステムアーキテクチャー、ETL プロセス、データ構造、および管理ツールを完全に再利用します。

移行範囲

Teradata の完全な移行には、以下の 4 つの領域が含まれます。

  1. 既存データ: 指定されたデリミタと文字コードを使用してデータをテキストファイルとしてエクスポートし、Elastic Compute Service (ECS) インスタンスのローカルディスクまたは AnalyticDB for PostgreSQL インスタンスと同じネットワーク上の Object Storage Service (OSS) バケットに保存します。その後、gpfdist プロトコルを介して OSS 外部テーブルからファイルをロードします。Teradata から DDL スクリプトをエクスポートし、AnalyticDB for PostgreSQL 構文を使用してバッチ変換します。

  2. Extract-Transform-Load (ETL) プロセス: スクリプトベースの変換ツールを使用して、ETL ステートメントを AnalyticDB for PostgreSQL の Data Manipulation Language (DML) 構文に変換します。このドキュメントの関数マッピングテーブルに基づいて、Teradata 関数を AnalyticDB for PostgreSQL の同等機能に置き換えます。既存データ移行の完了後、ETL ジョブを再構成して再起動します。

  3. API 接続: AnalyticDB for PostgreSQL は JDBC および ODBC プロトコルをサポートしているため、ビジネスインテリジェンス (BI) フロントエンドツールも同様に接続します。API 移行を完了するには、インスタンスの IP アドレスを更新します。

  4. 管理ツール: AnalyticDB for PostgreSQL インスタンス用のバックアップと復元ツールをデプロイし、定期的なリカバリ訓練をスケジュールします。

データ型マッピング

ほとんどのコアデータ型は、Teradata と AnalyticDB for PostgreSQL 間で直接マッピングされます。スクリプトベースの Data Definition Language (DDL) 変換ツールは、バッチ変換を自動的に処理します。

TeradataAnalyticDB for PostgreSQLNotes
CHARCHAR直接マッピング
VARCHARVARCHAR直接マッピング
LONG VARCHARVARCHAR(64000)固定最大長
VARBYTE(size)BYTEAバイナリデータ型
BYTEINTBYTEAバイナリデータ型
SMALLINTSMALLINT直接マッピング
INTEGERINTEGER直接マッピング
DECIMAL(size,dec)DECIMAL(size,dec)直接マッピング
NUMERIC(precision,dec)NUMERIC(precision,dec)直接マッピング
FLOATFLOAT直接マッピング
REALREAL直接マッピング
DOUBLE PRECISIONDOUBLE PRECISION直接マッピング
DATEDATE直接マッピング
TIMETIME直接マッピング
TIMESTAMPTIMESTAMP直接マッピング

テーブル作成ステートメント

以下の例では、Teradata DDL 文が AnalyticDB for PostgreSQL にどのように対応するかを示します。主な違いは、変換後の文に注釈が付けられています。

Teradata:

CREATE MULTISET TABLE test_table,NO FALLBACK ,
     NO BEFORE JOURNAL,
     NO AFTER JOURNAL,
     CHECKSUM = DEFAULT,
     DEFAULT MERGEBLOCKRATIO
     (
      first_column DATE FORMAT 'YYYYMMDD' TITLE 'COLUMN 1' NOT NULL,
      second_column INTEGER TITLE 'COLUMN 2' NOT NULL ,
      third_column CHAR(6) CHARACTER SET LATIN CASESPECIFIC TITLE 'COLUMN 3' NOT NULL ,
      fourth_column CHAR(20) CHARACTER SET LATIN CASESPECIFIC TITLE 'COLUMN 4' NOT NULL,
      fifth_column CHAR(1) CHARACTER SET LATIN CASESPECIFIC TITLE 'COLUMN 5' NOT NULL,
      sixth_column CHAR(24) CHARACTER SET LATIN CASESPECIFIC TITLE 'COLUMN 6' NOT NULL,
      seventh_column VARCHAR(18) CHARACTER SET LATIN CASESPECIFIC TITLE 'COLUMN 7' NOT NULL,
      eighth_column DECIMAL(18,0) TITLE 'COLUMN 8' NOT NULL ,
      nineth_column DECIMAL(18,6) TITLE 'COLUMN 9' NOT NULL )
PRIMARY INDEX ( first_column ,fourth_column )
PARTITION BY RANGE_N(first_column  BETWEEN DATE '1999-01-01' AND DATE '2050-12-31' EACH INTERVAL '1' DAY );

CREATE INDEX test_index (first_column, fourth_column) ON test_table;

AnalyticDB for PostgreSQL:

-- MULTISET TABLE, NO FALLBACK, NO BEFORE JOURNAL, NO AFTER JOURNAL,
-- CHECKSUM, DEFAULT MERGEBLOCKRATIO: Teradata 固有の句は削除されました
-- FORMAT 'YYYYMMDD', TITLE, CHARACTER SET, CASESPECIFIC: 列属性は削除されました
CREATE TABLE test_table
     (
      first_column DATE NOT NULL,           -- FORMAT 'YYYYMMDD' は削除されました。エンコーディングには SET client_encoding を使用します
      second_column INTEGER NOT NULL ,
      third_column CHAR(6) NOT NULL ,
      fourth_column CHAR(20) NOT NULL,
      fifth_column CHAR(1) NOT NULL,
      sixth_column CHAR(24) NOT NULL,
      seventh_column VARCHAR(18) NOT NULL,
      eighth_column DECIMAL(18,0) NOT NULL ,
      nineth_column DECIMAL(18,6) NOT NULL )
DISTRIBUTED BY ( first_column ,fourth_column )   -- PRIMARY INDEX -> DISTRIBUTED BY
PARTITION BY RANGE(first_column)                  -- RANGE_N 構文は標準の RANGE に変換されました
(START (DATE '1999-01-01')  INCLUSIVE
END (DATE '2050-12-31')  INCLUSIVE
EVERY (INTERVAL '1 DAY' ) );

create index test_index on test_table(first_column, fourth_column);  -- インデックス構文は変更されていません

DDL 差分のまとめ

AreaTeradataAnalyticDB for PostgreSQL
分散キーPRIMARY INDEX (col1, col2)DISTRIBUTED BY (col1, col2)
パーティショニングPARTITION BY RANGE_N(...)PARTITION BY RANGE(...) with START/END/EVERY
インデックス作成CREATE INDEX idx (cols) ON tableCREATE INDEX idx ON table(cols)
列タイトルTITLE 'label'COMMENT ON COLUMN table.col IS 'label';
列エンコーディングCHARACTER SET LATIN CASESPECIFICSET client_encoding = latin1; (セッションレベル)
テーブル属性MULTISET, NO FALLBACK, CHECKSUM, etc.サポートされていません。これらの句を削除します

データインポートおよびエクスポート形式

Teradata と AnalyticDB for PostgreSQL は両方とも TXT および CSV ファイル形式をサポートしています。主な相違点は区切り文字です。

  • Teradata: 2 文字の区切り文字

  • AnalyticDB for PostgreSQL: 1 文字の区切り文字

ロードする前に、データファイル内の区切り文字を変換してください。

SQL ステートメントの相違点

AnalyticDB for PostgreSQL は、ほとんどの Teradata SQL 構文をサポートしています。以下のステートメントは変換が必要です。

CAST

Teradata の CAST 文は書式指定子をサポートしていますが、AnalyticDB for PostgreSQL はサポートしていません。

StatementTeradataAnalyticDB for PostgreSQL
Integer castCAST(x AS INT FORMAT '999999')置き換えにはカスタム関数を作成します
Date castCAST(x AS DATE FORMAT 'YYYYMMDD')CAST(x AS DATE)YYYY-MM-DD — 変更は不要です。YYYY-MM-DD はネイティブにサポートされています

QUALIFY

Teradata の QUALIFY キーワードは、ウィンドウ関数の結果をインラインでフィルターします。AnalyticDB for PostgreSQL は QUALIFY をサポートしていないため、サブクエリとして書き換える必要があります。

Teradata:

SELECT itemid, sumprice, RANK() OVER (ORDER BY sumprice DESC)
     FROM (SELECT a1.item_id, SUM(a1.sale)
           FROM sales AS a1
           GROUP BY a1.itemID) AS t1 (itemid, sumprice)
     QUALIFY RANK() OVER (ORDER BY sum_price DESC) <=100;

AnalyticDB for PostgreSQL:

-- ウィンドウ関数をサブクエリでラップし、外側の WHERE 句でフィルタリングします
SELECT itemid, sumprice, rank FROM
(SELECT itemid, sumprice, RANK() OVER (ORDER BY sumprice DESC) AS rank
     FROM (SELECT a1.item_id, SUM(a1.sale)
           FROM sales AS a1
           GROUP BY a1.itemID) AS t1 (itemid, sumprice)
)  AS a
WHERE rank <=100;

MACRO

Teradata マクロは、名前付きの単位として一連の SQL ステートメントを実行します。AnalyticDB for PostgreSQL はマクロをサポートしていません。代わりに、FUNCTION を使用してください。

Teradata:

CREATE MACRO Get_Emp_Salary(EmployeeNo INTEGER) AS (
   SELECT
   EmployeeNo,
   NetPay
   FROM
   Salary
   WHERE EmployeeNo = :EmployeeNo;
);

AnalyticDB for PostgreSQL:

CREATE OR REPLACE FUNCTION Get_Emp_Salary(
        EmployeeNo INTEGER,
        OUT EmployeeNo INTEGER,
        OUT NetPay FLOAT
) RETURNS SETOF RECORD AS
$$
        SELECT EmployeeNo, NetPay
        FROM Salary
        WHERE EmployeeNo = $1
$$
 LANGUAGE SQL;

関数マッピング

以下の表は、Teradata 関数と AnalyticDB for PostgreSQL の同等機能とのマッピングを示しています。直接的な同等機能がない関数については、使用する SQL 式が表に示されています。

TeradataAnalyticDB for PostgreSQLDescription
ZEROIFNULL(x)COALESCE(x, 0)累積計算のために NULL を 0 に変換します
NULLIFZERO(x)COALESCE累積データのために 0 の値を NULL に置き換えます
INDEX(str, substr)POSITION(substr IN str)文字列内の部分文字列の位置を返します
ADD_MONTHS(date, n)TO_DATE入力日付に指定された月数を加算または減算します
FORMATTO_CHAR / TO_DATEデータを文字列または日付としてフォーマットします
CSUM(col, order_col)サブクエリパーティション内の各行の値式の累積合計を返します
MAVG(col, n, order_col)サブクエリ定義された行数 (クエリ幅) に基づいて、指定された列の移動平均を計算します
MSUM(col, n, order_col)サブクエリ定義されたクエリ幅に基づいて、指定された列の移動合計を計算します
MDIFF(col, n, order_col)サブクエリ定義されたクエリ幅に基づいて、指定された列の移動差分を計算します
QUALIFYウィンドウ関数結果に対する WHERE を含むサブクエリ資格確認ウィンドウ関数の結果をフィルタリングします。上記の「QUALIFY」セクションをご参照ください。
CHAR(str) / CHARACTERS(str)LENGTH(str)文字列内の文字数を返します