本文分享自华为云社区《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)
复制代码
点击关注,第一时间了解华为云新鲜技术~
评论