摘要:提供一種執行高效的TereData的marco遷移方案。 本文分享自華為雲社區《GaussDB(DWS)遷移 - teredata相容 -- macro相容 # 【玩轉PB級數倉GaussDB(DWS)】》,作者: 譡里個檔 。 Teradata的巨集是一組可以接受參數的SQL語句,通過調用巨集名 ...
摘要:提供一種執行高效的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)