AntDB集群实现自定义函数作为查询条件下发到datanode

六月ゝ 毕业季﹏ 提交于 2019-11-30 09:41:58

AntDB

原来,AntDB集群版本中,自定义函数不能下发到datanode上执行,所以需要将数据来到coordinator上进行二次过滤。现在,当用户确定自定义函数可以下发到datanode上,对结果不会造成影响时,可以在创建函数时,添加cluster safe参数,实现这个功能,从而加快查询,不需要二次过滤。

下面,将测试测函数的效果:

测试sql:

创建一个基础表和一个视图,视图只存在于coordinator上,不存在与datanode上。所以,当从视图中查询时,满足视图的条件会展开到datanode上。

CREATE TABLE base_tbl (person text, visibility text);

INSERT INTO base_tbl VALUES ('Tom', 'public'),

('Dick', 'private'),

('Harry', 'public');

CREATE VIEW rw_view1 AS

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

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!