日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

Teradata应用迁移到AnalyticDB for PostgreSQL指导

發(fā)布時(shí)間:2024/8/23 数据库 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Teradata应用迁移到AnalyticDB for PostgreSQL指导 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

AnalyticDB for PostgreSQL(簡(jiǎn)稱(chēng):ADB for PG)對(duì)Teradata語(yǔ)法有著很好的兼容,將Teradata應(yīng)用遷移到ADB for PG,只需進(jìn)行有限的修改。本文介紹將Teradata應(yīng)用遷移到ADB for PG應(yīng)該注意的事項(xiàng)。

1 建表語(yǔ)句

我們通過(guò)一個(gè)例子比較ADB for PG和Teradata的建表語(yǔ)句。對(duì)于如下的Teradata建表SQL語(yǔ)句,

CREATE MULTISET TABLE test_table,NO FALLBACK ,NO BEFORE JOURNAL,NO AFTER JOURNAL,CHECKSUM = DEFAULT,DEFAULT MERGEBLOCKRATIO(first_column DATE FORMAT 'YYYYMMDD' TITLE '第一列' NOT NULL,second_column INTEGER TITLE '第二列' NOT NULL ,third_column CHAR(6) CHARACTER SET LATIN CASESPECIFIC TITLE '第三列' NOT NULL ,fourth_column CHAR(20) CHARACTER SET LATIN CASESPECIFIC TITLE '第四列' NOT NULL,fifth_column CHAR(1) CHARACTER SET LATIN CASESPECIFIC TITLE '第五列' NOT NULL,sixth_column CHAR(24) CHARACTER SET LATIN CASESPECIFIC TITLE '第六列' NOT NULL,seventh_column VARCHAR(18) CHARACTER SET LATIN CASESPECIFIC TITLE '第七列' NOT NULL,eighth_column DECIMAL(18,0) TITLE '第八列' NOT NULL ,nineth_column DECIMAL(18,6) TITLE '第九列' 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;

可以修改成ADB for PG的建表語(yǔ)句:

CREATE TABLE test_table(first_column DATE NOT NULL,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 ) PARTITION BY RANGE(first_column) (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);

通過(guò)以上例子,我們可以很清晰地分析ADB for PG和Teradata建表語(yǔ)句的異同:
1、ADB for PG和Teradata的數(shù)據(jù)類(lèi)型是互相兼容的,數(shù)據(jù)類(lèi)型不需要做修改;
2、ADB for PG和Teradata均支持分布列,但語(yǔ)法不同,Teradata是primary index,ADB for PG是distributed by;
3、ADB for PG和Teradata均支持PARTITION BY二級(jí)分區(qū),語(yǔ)義相同但語(yǔ)法不同;
4、ADB for PG和Teradata均支持對(duì)表創(chuàng)建索引,但語(yǔ)法不同;
5、ADB for PG不支持TITLE關(guān)鍵字,但是支持單獨(dú)對(duì)列添加注釋COMMENT,語(yǔ)法為COMMENT ON COLUMN table_name.column_name IS 'XXX';
6、ADB for PG不能在定義char或者varchar時(shí)聲明編碼類(lèi)型,而是在連接上數(shù)據(jù)庫(kù)時(shí),通過(guò)執(zhí)行“SET client_encoding = latin1;”來(lái)申明編碼類(lèi)型。

2 導(dǎo)入導(dǎo)出數(shù)據(jù)格式

ADB for PG支持txt、csv格式的數(shù)據(jù)導(dǎo)入導(dǎo)出,和Teradata的區(qū)別就在于數(shù)據(jù)文件的分隔符:Teradata支持雙分隔符,而ADB for PG只支持單分隔符。

3 SQL語(yǔ)句

ADB for PG和Teradata的SQL語(yǔ)法大部分都是兼容的,除了特定的Teradata語(yǔ)法、系統(tǒng)函數(shù)是需要進(jìn)行修改的。

3.1 特定語(yǔ)法

3.3.1 cast

Teradata支持類(lèi)似如下的cast語(yǔ)法:

cast(XXX as int format '999999') cast(XXX as date format 'YYYYMMDD')

而ADB for PG支持類(lèi)似cast(XXX as int)、cast(XXX as date),不支持在cast中聲明format。所以,對(duì)于cast(XXX as int format '999999'),需要編寫(xiě)函數(shù)來(lái)實(shí)現(xiàn)相同功能;而對(duì)于cast(XXX as date format 'YYYYMMDD'),ADB for PG支持date的顯示格式為'YYYY-MM-DD',這個(gè)是不影響正常使用的。

3.3.2 qualify

Teradata的qualify關(guān)鍵字,用來(lái)根據(jù)用戶(hù)的條件,進(jìn)一步過(guò)濾前序排序計(jì)算函數(shù)得到的結(jié)果。如下是一個(gè)Teradata的qualify關(guān)鍵字使用例子:

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;

而ADB for PG是不支持qualify關(guān)鍵字的,所以需要將帶qualify的sql語(yǔ)句,修改為子查詢(xún)嵌套:

SELECT itemid, sumprice, rank from (SELECT itemid, sumprice, RANK() OVER (ORDER BY sumprice DESC) as rankFROM (SELECT a1.item_id, SUM(a1.sale)FROM sales AS a1 GROUP BY a1.itemID) AS t1 (itemid,sumprice) ) AS a where rank <=100;

3.3.3 macro

Teradata通過(guò)macro來(lái)執(zhí)行一組SQL語(yǔ)句,一個(gè)典型的macro例子為:

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

ADB for PG不支持macro,但是可以輕易地用ADB for PG的function來(lái)完成Teradata的macro功能:

CREATE OR REPLACE FUNCTION Get_Emp_Salary(EmployeeNo INTEGER,OUT EmployeeNo INTEGER,OUT NetPay FLOAT ) returns setof record AS $$SELECT EmployeeNo,NetPay FROM SalaryWHERE EmployeeNo = $1$$LANGUAGE SQL;

3.3.4 系統(tǒng)函數(shù)

ADB for PG和Teradata關(guān)鍵系統(tǒng)函數(shù)對(duì)照表:

TeradataADB for PG備注
zeroifnull(C)COALESCE(C,0)如果C為空,則返回0
substr(str, from, len)substring(str, from, len)從str中的第from開(kāi)始,截取len長(zhǎng)度子串
index(str1, str2)strpos(str1, str2)確定str2在str1中的位置
oreplace(str1, str2, str3)replace(str1, str2, str3)把str1中的str2替換成str3
random(lower_bound,upper_bound)floor(random() * (upper_bound - lower_bound) + lower_bound)取lower_bound和upper_bound之間的隨機(jī)整數(shù)


原文鏈接
本文為云棲社區(qū)原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。

總結(jié)

以上是生活随笔為你收集整理的Teradata应用迁移到AnalyticDB for PostgreSQL指导的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。