【问题标题】:PostgreSQL: replace plpgsql function by sql function [closed]PostgreSQL:用sql函数替换plpgsql函数[关闭]
【发布时间】:2017-07-11 07:46:34
【问题描述】:

免责声明这可能是一个更理论、更不切实际的问题。

我正在尝试用sql 函数替换plpgsql 函数不改变行为或结果类型。函数如下所示:

create function f() returns void as
$$
begin
    perform       some_other_function(my_table.my_column)
    from          my_table;
end;
$$
language plpgsql volatile;

这个函数返回void,因为我不关心结果。

如前所述,我正在尝试用 sql 函数替换它。此函数在sql 函数链中使用,因此在性能方面最好将此函数同时作为sql 函数而不是plpgsql(再次参见免责声明)。

以下不起作用,因为现在只处理my_table 的第一行。

create function f() returns void as
$$
    select       some_other_function(my_table.my_column)
    from         my_table;
$$
language sql volatile;

请注意,函数 some_other_function 也返回一个 void。

还有其他聪明的尝试方法吗?

【问题讨论】:

  • 如果我们不知道正在实现什么功能,这很难回答。
  • some_other_function(id) 在某个日志记录表中创建一个新行。所以,f() 的解释:对于my_table 中的每一行,我使用some_other_function(id) 在某处创建一行。
  • select count(some_other_function(my_table.my_column))::text::void from my_table;
  • select exists(some_other_function(my_table.my_column))::text::void from my_table; 也许快一点?或者 PostgreSQL 会因为 exists 已经完成而在第一行之后优化并停止?
  • 如果您不打算在每个语句中调用此函数数千次 - 最好简单。与读/写操作相比,plpgsql 的一些可能的额外系统资源也非常小。

标签: postgresql plpgsql sql-function


【解决方案1】:

您可以使用 SQL 语句,该语句必须扫描整个表才能生成第一个结果行,例如

CREATE OR REPLACE FUNCTION f() RETURNS void
   LANGUAGE sql STABLE AS
'SELECT count(CASE
                WHEN some_other_function(my_table.my_column) IS NULL
                THEN 0
             END
       )::text::void
FROM my_table';

CREATE OR REPLACE FUNCTION f() RETURNS void
   LANGUAGE sql STABLE AS
'SELECT count(*)::text::void
FROM (
      SELECT some_other_function(my_table.my_column)
      FROM my_table
     ) q';

【讨论】:

  • 谢谢,所有好的建议。可能是愚蠢的问题,但最有意义的是:这种sql 查询是为了避免plpgsql 函数,还是保持简单并保持plpgsql 函数如最初问题中所述?
  • 最好继续使用 PL/pgSQL。像这样的复杂 SQL 函数无论如何都无法内联。
  • 有道理。谢谢。
猜你喜欢
  • 2015-01-26
  • 1970-01-01
  • 2015-04-05
  • 2020-02-04
  • 2017-12-11
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
相关资源
最近更新 更多