AntDB集羣實現自定義函數做爲查詢條件下發到datanode

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愛好者使用和交流。

相關文章
相關標籤/搜索