Postgresql

SUM() 函式的結果

  • January 19, 2018

我使用 Pl/Proxy 擴展來對錶進行分片。它就像一個魅力,除了這個:

我有一個在 4 個分片上執行的函式。它看起來像這樣:

CREATE OR REPLACE
FUNCTION count_comm(
   id_toto INTEGER,
   OUT out_nb_toto INTEGER
) RETURNS SETOF INTEGER AS $$
       CLUSTER 'main'; RUN ON ALL;
$$ LANGUAGE plproxy;

它返回給我一個 SETOF INTEGERS 像這樣:

p_commentaire=> SELECT count_toto(42);
count_commentaire_from_id_toto 
---------------------------------
                        2172022

所以基本上,每個結果都是每個分片的 COUNT(),正如我所說的,它工作得很好。問題是,我想知道是否有辦法對所有結果進行 SUM() 以獲得總計,而不是單獨獲得 4 個結果……

編輯:只是為了添加一些東西,當您在所有分片上執行查詢時,PlProxy需要一個“SETOF”返回。

所以,我找到了一個解決方法……

首先,我創建了一個代理函式,第一個代理函式將在其上執行:

CREATE OR REPLACE
FUNCTION p_count_toto(
   in_id_toto INTEGER
) RETURNS INTEGER AS $func$
BEGIN
       RETURN (SELECT sum(tmp_nb_toto) out_nb_toto FROM count_comm(in_id_alias));
END;
$func$ LANGUAGE plpgsql;

我修改了我的第一個 PL/Proxy 函式,現在看起來像這樣:

CREATE OR REPLACE FUNCTION count_toto(
       in_id_toto INTEGER,
       OUT tmp_nb_toto INTEGER
) RETURNS SETOF INTEGER AS $$
       CLUSTER 'main'; RUN ON ALL;
$$ LANGUAGE plproxy;

我認為這不是最優雅的方式,因為在應用程序級別,開發人員將不得不更改他們將呼叫的過程的名稱,但它確實有效。

您可以只使用 SQL 語句:

SELECT sum(out_nb_comm) AS sum_out_nb_comm
FROM   count_comm($in_id_alias);

或者,如果你想將它包裝在一個函式中,一個簡單的 SQL 函式就可以完成這項工作:

CREATE OR REPLACE FUNCTION sum_count_comm(in_id_alias int)
  RETURNS int AS
$func$
SELECT sum(out_nb_comm)::int
FROM   count_comm($1));
$func$ LANGUAGE sql;

引用自:https://dba.stackexchange.com/questions/73501