翼度科技»论坛 编程开发 mysql 查看内容

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

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
摘要:提供一种执行高效的TereData的marco迁移方案。
本文分享自华为云社区《GaussDB(DWS)迁移 - teredata兼容 -- macro兼容 # 【玩转PB级数仓GaussDB(DWS)】》,作者: 譡里个檔 。
Teradata的宏是一组可以接受参数的SQL语句,通过调用宏名称来执行一段SQL语句,执行上类似于DWS的存储过程。在迁移的时候也建议使用DWS的函数替换TeraData的宏。
测试表定义
  1. CREATE SCHEMA test;
  2. CREATE TABLE test.salary(
  3. employeeno integer,
  4. netpay integer
  5. )
  6. WITH (orientation=row, compression=no)
  7. DISTRIBUTE BY ROUNDROBIN;
  8. INSERT INTO test.salary VALUES (1, 1);
复制代码
TereData宏定义
  1. CREATE MACRO get_emp_salary(employeeno integer) AS (
  2. SELECT
  3. employeeno,
  4. netpay
  5. FROM test.salary
  6. WHERE employeeno = :employeeno;
  7. );
复制代码
DWS迁移的函数定义
  1. CREATE OR REPLACE FUNCTION public.get_emp_salary(
  2. employeeno integer,
  3. OUT employeeno integer,
  4. OUT netpay integer
  5. )
  6. RETURNS SETOF record
  7. LANGUAGE sql
  8. NOT SHIPPABLE STABLE
  9. AS $function$
  10. SELECT
  11. employeeno,
  12. netpay
  13. FROM test.salary
  14. WHERE employeeno = $1;
  15. $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)
语句执行效果
  1. postgres=# EXPLAIN VERBOSE SELECT * FROM get_emp_salary(1);
  2.                                               QUERY PLAN
  3. ------------------------------------------------------------------------------------------------------
  4.   id |                      operation                      | E-rows | E-distinct | E-width | E-costs
  5. ----+-----------------------------------------------------+--------+------------+---------+---------
  6. 1 | -> Data Node Scan on salary "_REMOTE_TABLE_QUERY_" | 1 | | 8 | 0.00
  7. Targetlist Information (identified by plan id)
  8. ------------------------------------------------------------------------------------------
  9. 1 --Data Node Scan on salary "_REMOTE_TABLE_QUERY_"
  10.          Output: salary.employeeno, salary.netpay
  11.          Node/s: All datanodes
  12.          Remote query: SELECT employeeno, netpay FROM ONLY test.salary WHERE employeeno = 1
  13. (10 rows)
复制代码
 
点击关注,第一时间了解华为云新鲜技术~

来源:https://www.cnblogs.com/huaweiyun/p/17116883.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具