有功能:
CREATE OR REPLACE FUNCTION report_children_without_place(text,date,integer) RETURNS TABLE (department_name character varying,kindergarten_name character varying,a1 bigint) AS $BODY$ BEGIN RETURN QUERY WITH rh AS ( SELECT (array_agg(status ORDER BY date DESC))[1] AS status,request FROM requeststatushistory WHERE date <= $3 GROUP BY request ) SELECT w.name,kgn.name,COUNT(*) FROM kindergarten_request_table_materialized kr JOIN rh ON rh.request = kr.id JOIN requeststatuses s ON s.id = rh.status AND s.sysname IN ('confirmed','need_meet_completion','kindergarten_need_meet') JOIN workareas kgn ON kr.kindergarten = kgn.id AND kgn.tree <@ CAST($1 AS LTREE) AND kgn.active JOIN organizationforms of ON of.id = kgn.organizationform AND of.sysname IN ('state','municipal','departmental') JOIN workareas w ON w.tree @> kgn.tree AND w.active JOIN workareatypes mt ON mt.id = w.type AND mt.sysname = 'management' WHERE kr.requestyear = $4 GROUP BY kgn.name,w.name ORDER BY w.name,kgn.name; END $BODY$LANGUAGE PLPGsql STABLE; EXPLAIN ANALYZE SELECT * FROM report_children_without_place('83.86443.86445','14-04-2015',2014);
总运行时间:242805.085 ms.
但是从函数体的查询执行得更快:
EXPLAIN ANALYZE WITH rh AS ( SELECT (array_agg(status ORDER BY date DESC))[1] AS status,request FROM requeststatushistory WHERE date <= '14-04-2015' GROUP BY request ) SELECT w.name,COUNT(*) FROM kindergarten_request_table_materialized kr JOIN rh ON rh.request = kr.id JOIN requeststatuses s ON s.id = rh.status AND s.sysname IN ('confirmed','kindergarten_need_meet') JOIN workareas kgn ON kr.kindergarten = kgn.id AND kgn.tree <@ CAST('83.86443.86445' AS LTREE) AND kgn.active JOIN organizationforms of ON of.id = kgn.organizationform AND of.sysname IN ('state','departmental') JOIN workareas w ON w.tree @> kgn.tree AND w.active JOIN workareatypes mt ON mt.id = w.type AND mt.sysname = 'management' WHERE kr.requestyear = 2014 GROUP BY kgn.name,w.name ORDER BY w.name,kgn.name;