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

摘要:提供一种执行高效的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 sql
NOT SHIPPABLE STABLE
AS $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)

 

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

posted @ 2023-02-13 16:38  华为云开发者联盟  阅读(165)  评论(0编辑  收藏  举报