本文分享自華為雲社群《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部落格_雲計算部落格_開發者中心-華為雲
#華為雲開發者聯盟#