Greenplum问题:函数无法在段上执行,因为它访问关系

Posted

技术标签:

【中文标题】Greenplum问题:函数无法在段上执行,因为它访问关系【英文标题】:Greenplum issue : function cannot execute on segment because it accesses relation 【发布时间】:2016-07-01 12:25:32 【问题描述】:

我正在使用 Greenplum 数据库。下面是我之前执行的函数定义。

CREATE OR REPLACE FUNCTION testfunc(IN id int, OUT rate double precision)
RETURNS double precision AS
$BODY$
begin
select count(*) into rate from ref_test_V
return;
end;
$BODY$
  LANGUAGE plpgsql VOLATILE;

当我在选择列表中调用这个函数时,它会抛出错误

查询: select 1,testfunc(id) from ref_test

错误: XX000:函数无法在段上执行,因为它访问关系“public.ref_test_v”(functions.c:155)(seg25 slice1 *****.com 1026 pid=193132) (cdbdisp.c:1326)

【问题讨论】:

【参考方案1】:

Greenplum 不支持此功能。想想如果它被支持它会做什么。它会从一个段中获取一行,然后从它本身做一个 count(*)。将检索下一行并再次执行计数(*)。

执行此操作的纯 SQL 方法是:

with x as (select count(*) as total_count from ref_test_V)
select 1, x.total_count from ref_test, x;

如果您不喜欢使用公用表表达式,可以使用子查询来实现。

select 1, x.total_count 
from   ref_test, 
       (select count(*) as total_count 
       from ref_test_V) as x;

【讨论】:

我明白这一点,但我想问的是我想根据函数的参数获取具有过滤器值的某个表的计数,并且该函数是从其他表中调用的选择列表。如果我的语法错误,您能否指出正确的语法。示例代码将对我有所帮助。请注意,我不想实现为 SQL。 TIA :) 我已经按照您说的进行了尝试,但问题仍然存在。您能否提供任何可以帮助我的示例代码。我尝试了一切从函数中读取表的记录计数,当我从另一个表的选择列表中调用此函数时,继续收到相同的问题。 TIA :) 我想管理我的功能比我在此博客中解释的更重要,并且问题是由于我之前所说的而引起的,这就是我让它变得简单的原因。由于其复杂性,我无法将该功能实现为 SQL 或 CTE。希望您能帮我找到解决此问题的方法。 从选择列表调用时,是否无法从函数中读取表数据。上述函数在使用常量值作为参数单独调用时有效,但在选择列表中调用时无效。希望有没有其他方法可以克服这个或内联 SQL 是唯一的方法 是的,我同意,我也尝试了两个不同的表,但问题仍然存在。是的,子查询或 CTE 会更有效,但函数的复杂性让我不得不进行函数转换。因此,如果您能向我展示上述函数的正确语法,以便我可以在我的函数中实现它,将会很有帮助。【参考方案2】:

调用下表中的函数。

select 1, (select testfunc(5)) from ref_test;

【讨论】:

如果您将常量值作为参数传递它会起作用,当您从 ref_test 传递列时它不起作用,这就是我的意思。

以上是关于Greenplum问题:函数无法在段上执行,因为它访问关系的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView ReloadData 未正确显示内容

如何执行 GreenPlum 6.x 备份和恢复

Greenplum:有没有办法定义一个数据将只存储在 master 中的表

无法在 Greenplum 中使用 DO 执行匿名代码块

在 GKE 上安装 Greenplum

将整个数据库从 postgresql 传输到 Greenplum 服务器