AntDBnode
原來,AntDB集羣版本中,自定義函數不能下發到datanode上執行,因此須要將數據來到coordinator上進行二次過濾。如今,當用戶肯定自定義函數能夠下發到datanode上,對結果不會形成影響時,能夠在建立函數時,添加cluster safe參數,實現這個功能,從而加快查詢,不須要二次過濾。git
下面,將測試測函數的效果:github
測試sql:sql
建立一個基礎表和一個視圖,視圖只存在於coordinator上,不存在與datanode上。因此,當從視圖中查詢時,知足視圖的條件會展開到datanode上。函數
CREATE TABLE base_tbl (person text, visibility text);oop
INSERT INTO base_tbl VALUES ('Tom', 'public'),post
('Dick', 'private'),測試
('Harry', 'public');postgresql
CREATE VIEW rw_view1 ASblog
SELECT person FROM base_tbl WHERE visibility = 'public';
snoop函數是非cluster safe函數,snoop2是cluster safe函數。
CREATE FUNCTION snoop(anyelement)
RETURNS boolean AS
$$
BEGIN
RAISE NOTICE 'snooped value: %', $1;
RETURN true;
END;
$$
LANGUAGE plpgsql COST 0.000001;
CREATE FUNCTION snoop2(anyelement)
RETURNS boolean CLUSTER SAFE AS
$$
BEGIN
RAISE NOTICE 'snooped value: %', $1;
RETURN true;
END;
$$
LANGUAGE plpgsql COST 0.000001;
對AntDB單pg版本、集羣版本上使用snoop和snoop2函數過濾數據,執行計劃的不一樣。
AntDB單pg版本:
能夠看到,在單pg版本上,snoop函數和展開後的視圖一塊兒做爲過濾條件,從表中過濾出數據。
explain verbose SELECT * FROM rw_view1 WHERE snoop(person);
AntDB集羣版本:
能夠看到,在非cluster safe函數不能下發到datanode上,因此視圖在datanode上展開,過濾出數據後拉到coordinator上,而後進行二次過濾。
explain verbose SELECT * FROM rw_view1 WHERE snoop(person);
當條件中有cluster safe函數時,能夠看到,可以達到單pg的效果,函數做爲過濾條件下發到datanode上。
explain verbose SELECT * FROM rw_view1 WHERE snoop2(person);
參考:
QQ交流羣:496464280
源碼地址:http://github.com/ADBSQL
歡迎廣大postgresql愛好者使用和交流。