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爱好者使用和交流。
来源:oschina
链接:https://my.oschina.net/u/3771732/blog/2208771