写点什么

GaussDB(DWS) 迁移:一种执行高效的 TereData 的 marco 迁移方案

  • 2023-02-13
    中国香港
  • 本文字数:1228 字

    阅读完需:约 4 分钟

GaussDB(DWS)迁移:一种执行高效的TereData的marco迁移方案

本文分享自华为云社区《GaussDB(DWS)迁移 - teredata兼容 -- macro兼容 # 【玩转PB级数仓GaussDB(DWS)】》,作者: 譡里个檔 。


Teradata 的宏是一组可以接受参数的 SQL 语句,通过调用宏名称来执行一段 SQL 语句,执行上类似于 DWS 的存储过程。在迁移的时候也建议使用 DWS 的函数替换 TeraData 的宏。

测试表定义


CREATE SCHEMA test;CREATE TABLE test.salary(    employeeno integer,    netpay integer)WITH (orientation=row, compression=no)DISTRIBUTE BY ROUNDROBIN;
INSERT INTO test.salary VALUES (1, 1);
复制代码

TereData 宏定义


CREATE MACRO get_emp_salary(employeeno integer) AS (     SELECT         employeeno,         netpay     FROM test.salary     WHERE employeeno = :employeeno; );
复制代码

DWS 迁移的函数定义


CREATE OR REPLACE FUNCTION public.get_emp_salary(    employeeno integer,    OUT employeeno integer,    OUT netpay integer) RETURNS SETOF record LANGUAGE sqlNOT SHIPPABLE STABLEAS $function$    SELECT         employeeno,         netpay     FROM test.salary     WHERE employeeno = $1; $function$;
复制代码


Note:函数定义中属性要如上定义,需要明确的是


1) 必须是 STABLE


2) 函数语言必须是 SQL 语言


3) 查询语句的返回值类型和函数的出参类型一致


4) 必须是 NOT SHIPPABLE(默认就是 NOT SHIPPABLE 属性)


5) 不能定义为 STRICT 属性(默认就是非 STRICT 属性)


6) 不能定义配置参数(默认就是非 STRICT 属性)


7) 函数的权限属性为 SECURITY INVOKER(默认就是 SECURITY INVOKER 属性)


这样定义的好处是就是当函数体中是简单的单查询语句时,函数调用可以直接优化为对函数体内的 SQL 语句的调用,执行上避开 FuctionSCan 的换成层以及 SQL 不下推的问题,执行上更加高效(具体见下面的 case)

语句执行效果


postgres=# EXPLAIN VERBOSE SELECT * FROM get_emp_salary(1);                                              QUERY PLAN------------------------------------------------------------------------------------------------------  id |                      operation                      | E-rows | E-distinct | E-width | E-costs ----+-----------------------------------------------------+--------+------------+---------+---------   1 | ->  Data Node Scan on salary "_REMOTE_TABLE_QUERY_" |      1 |            |       8 | 0.00
Targetlist Information (identified by plan id) ------------------------------------------------------------------------------------------ 1 --Data Node Scan on salary "_REMOTE_TABLE_QUERY_" Output: salary.employeeno, salary.netpay Node/s: All datanodes Remote query: SELECT employeeno, netpay FROM ONLY test.salary WHERE employeeno = 1(10 rows)
复制代码

点击关注,第一时间了解华为云新鲜技术~

发布于: 刚刚阅读数: 3
用户头像

提供全面深入的云计算技术干货 2020-07-14 加入

生于云,长于云,让开发者成为决定性力量

评论

发布
暂无评论
GaussDB(DWS)迁移:一种执行高效的TereData的marco迁移方案_数据库_华为云开发者联盟_InfoQ写作社区