Postgresql
SUM() 函式的結果
我使用 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;