Todos os produtos
Search
Central de documentação

AnalyticDB:Migre aplicações Teradata para o AnalyticDB for PostgreSQL

Última atualização: Jun 27, 2026

O AnalyticDB for PostgreSQL é compatível com a sintaxe do Teradata. Este guia aborda as diferenças de sintaxe, os mapeamentos de tipos de dados e as funções equivalentes necessárias para planejar sua migração do Teradata para o AnalyticDB for PostgreSQL.

Requisitos de migração

Uma migração bem-sucedida do Teradata para o AnalyticDB for PostgreSQL deve atender aos seguintes objetivos:

  • Migrar completamente a plataforma de dados subjacente do data warehouse.

  • Garantir uma transição suave para as aplicações implantadas no sistema de data warehouse.

  • Migrar plataformas de negócios e dados sem impacto perceptível aos usuários.

  • Assegurar o bom desempenho do data warehouse após a migração.

  • Estabelecer prazos e planos de migração adequados.

  • Reaproveitar integralmente a arquitetura original do sistema, os processos de ETL, a estrutura de dados e as ferramentas de gerenciamento.

Escopo da migração

Uma migração completa do Teradata envolve quatro áreas:

  1. Dados históricos: Exporte os dados como arquivos de texto usando o delimitador e a codificação de caracteres especificados. Armazene-os nos discos locais da instância do Elastic Compute Service (ECS) ou em buckets do Object Storage Service (OSS) na mesma rede da instância do AnalyticDB for PostgreSQL e carregue os arquivos por meio de tabelas externas do OSS via protocolo gpfdist. Exporte scripts DDL do Teradata e converta-os em lote utilizando a sintaxe do AnalyticDB for PostgreSQL.

  2. Processos de Extração-Transformação-Carga (ETL): Converta instruções ETL para a sintaxe de Linguagem de Manipulação de Dados (DML) do AnalyticDB for PostgreSQL usando ferramentas de conversão baseadas em script. Substitua as funções do Teradata pelas equivalentes no AnalyticDB for PostgreSQL, conforme a tabela de mapeamento de funções neste documento. Reconfigure e reinicie os jobs de ETL após a conclusão da migração dos dados históricos.

  3. Conexões de API: O AnalyticDB for PostgreSQL suporta os protocolos JDBC e ODBC, permitindo que ferramentas de frontend de Business Intelligence (BI) se conectem da mesma maneira. Atualize o endereço IP da instância para concluir a migração da API.

  4. Ferramentas de gerenciamento: Implante ferramentas de backup e recuperação para a instância do AnalyticDB for PostgreSQL e agende testes regulares de recuperação.

Mapeamento de tipos de dados

A maioria dos tipos de dados principais possui mapeamento direto entre o Teradata e o AnalyticDB for PostgreSQL. As ferramentas de conversão de Linguagem de Definição de Dados (DDL) baseadas em script lidam com a conversão em lote automaticamente.

Teradata

AnalyticDB for PostgreSQL

Observações

CHAR

CHAR

Mapeamento direto

VARCHAR

VARCHAR

Mapeamento direto

LONG VARCHAR

VARCHAR(64000)

Comprimento máximo fixo

VARBYTE(size)

BYTEA

Tipo de dado binário

BYTEINT

BYTEA

Tipo de dado binário

SMALLINT

SMALLINT

Mapeamento direto

INTEGER

INTEGER

Mapeamento direto

DECIMAL(size,dec)

DECIMAL(size,dec)

Mapeamento direto

NUMERIC(precision,dec)

NUMERIC(precision,dec)

Mapeamento direto

FLOAT

FLOAT

Mapeamento direto

REAL

REAL

Mapeamento direto

DOUBLE PRECISION

DOUBLE PRECISION

Mapeamento direto

DATE

DATE

Mapeamento direto

TIME

TIME

Mapeamento direto

TIMESTAMP

TIMESTAMP

Mapeamento direto

Instruções de criação de tabela

Os exemplos a seguir mostram como uma instrução DDL do Teradata é mapeada para o AnalyticDB for PostgreSQL. As principais diferenças estão anotadas na instrução convertida.

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-specific clauses removed
-- FORMAT 'YYYYMMDD', TITLE, CHARACTER SET, CASESPECIFIC: column attributes removed
CREATE TABLE test_table
     (
      first_column DATE NOT NULL,           -- FORMAT 'YYYYMMDD' removed; use SET client_encoding for 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 syntax converted to standard 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);  -- index syntax unchanged

Resumo das diferenças de DDL

Área

Teradata

AnalyticDB for PostgreSQL

Chave de distribuição

PRIMARY INDEX (col1, col2)

DISTRIBUTED BY (col1, col2)

Particionamento

PARTITION BY RANGE_N(...)

PARTITION BY RANGE(...) com START/END/EVERY

Criação de índice

CREATE INDEX idx (cols) ON table

CREATE INDEX idx ON table(cols)

Título da coluna

TITLE 'label'

COMMENT ON COLUMN table.col IS 'label';

Codificação da coluna

CHARACTER SET LATIN CASESPECIFIC

SET client_encoding = latin1; (nível de sessão)

Atributos da tabela

MULTISET, NO FALLBACK, CHECKSUM, etc.

Não suportado; remova essas cláusulas

Formatos de importação e exportação de dados

Tanto o Teradata quanto o AnalyticDB for PostgreSQL suportam formatos de arquivo TXT e CSV. A principal diferença reside no separador:

  • Teradata: Separadores de dois caracteres

  • AnalyticDB for PostgreSQL: Separadores de caractere único

Converta os separadores em seus arquivos de dados antes do carregamento.

Diferenças em instruções SQL

O AnalyticDB for PostgreSQL suporta a maior parte da sintaxe SQL do Teradata. As instruções a seguir exigem conversão.

CAST

As instruções CAST do Teradata suportam especificadores de formato; o AnalyticDB for PostgreSQL não.

Instrução

Teradata

AnalyticDB for PostgreSQL

Conversão de inteiro

CAST(x AS INT FORMAT '999999')

Escreva uma função personalizada para substituição

Conversão de data

CAST(x AS DATE FORMAT 'YYYYMMDD')

CAST(x AS DATE) — nenhuma alteração necessária; YYYY-MM-DD é suportado nativamente

QUALIFY

A palavra-chave QUALIFY do Teradata filtra resultados de funções de janela diretamente na consulta. O AnalyticDB for PostgreSQL não suporta QUALIFY; reescreva como uma subconsulta.

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:

-- Wrap the window function in a subquery, then filter in the outer WHERE clause
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

As macros do Teradata executam um grupo de instruções SQL como uma unidade nomeada. O AnalyticDB for PostgreSQL não suporta macros; use uma FUNCTION em seu lugar.

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;

Mapeamento de funções

A tabela a seguir mapeia funções do Teradata para suas equivalentes no AnalyticDB for PostgreSQL. Para funções sem equivalente direto, a tabela fornece a expressão SQL a ser utilizada.

Teradata

AnalyticDB for PostgreSQL

Descrição

ZEROIFNULL(x)

COALESCE(x, 0)

Converte NULL para 0 em cálculos cumulativos

NULLIFZERO(x)

COALESCE

Substitui valores 0 por NULL em dados cumulativos

INDEX(str, substr)

POSITION(substr IN str)

Retorna a posição de uma substring dentro de uma string

ADD_MONTHS(date, n)

TO_DATE

Adiciona ou subtrai um número especificado de meses da data de entrada

FORMAT

TO_CHAR / TO_DATE

Formata dados como string ou data

CSUM(col, order_col)

Subconsulta

Retorna a soma cumulativa de uma expressão de valor para cada linha em uma partição

MAVG(col, n, order_col)

Subconsulta

Calcula a média móvel de uma coluna especificada com base em um número definido de linhas (largura da consulta)

MSUM(col, n, order_col)

Subconsulta

Calcula a soma móvel de uma coluna especificada com base em uma largura de consulta definida

MDIFF(col, n, order_col)

Subconsulta

Calcula a diferença móvel de uma coluna especificada com base em uma largura de consulta definida

QUALIFY

Subconsulta com WHERE no resultado da função de janela

Filtra resultados de funções de janela; consulte a seção QUALIFY acima

CHAR(str) / CHARACTERS(str)

LENGTH(str)

Retorna o número de caracteres em uma string