天天看點

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 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)           

點選下方,第一時間了解華為雲新鮮技術~

華為雲部落格_大資料部落格_AI部落格_雲計算部落格_開發者中心-華為雲

#華為雲開發者聯盟#

繼續閱讀