我正在尝试提高 PostgreSQL 函数和函数内部函数调用的性能。
在我们的应用程序中,PostgreSQL (9.6) 查询完全基于函数。例如,为了获取大量“项目”,可能会使用如下几行代码:
CREATE OR REPLACE FUNCTION public.item_read_one(
"itemID" integer)
RETURNS jsonb AS
$BODY$
DECLARE
outputvariable jsonb;
BEGIN
SELECT row_to_json (my_subquery) FROM (
SELECT
id,
"simpleField1",
"simpleField2",
item_status(id,"crucialField") AS status
FROM item_table
WHERE id = $1 AND deleted IS NOT TRUE)
AS my_subquery into outputvariable ;
RETURN outputvariable;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION public.item_read_one(integer)
OWNER TO some_user;
你看,在内部SELECT
,除了一些简单的字段之外,还有另一个函数调用。这些内部函数通常基于 plv8 并包含大量 JavaScript 逻辑,包括数据库查询。一个示例可能如下所示:
CREATE OR REPLACE FUNCTION public.item_status(
"itemID" integer,
"crucialField" text)
RETURNS jsonb AS
$BODY$
var returnStatus = {};
var myVariable;
if(crucialField == 'foo') {
myVariable = plv8.execute('SELECT something FROM other_table WHERE "itemID" = $1',[itemID]);
}
else if(crucialField == 'sweetKitten') {
myVariable = plv8.execute('SELECT "somethingElse" FROM kitten WHERE "itemID" = $1',[itemID]);
}
/*
A lot more JavaScript logic here. But you get the idea, I hope.
*/
return returnStatus;
$BODY$
LANGUAGE plv8 IMMUTABLE
COST 100;
ALTER FUNCTION public.item_status(integer, text)
OWNER TO some_user;
抛开这个设计是否有意义的问题,问题是:如何提高性能?
像 item_status 这样的函数返回的数据非常稳定,所以将它放入索引可能是有意义的,但我不知道如何。
使用的 PostgreSQL 版本是 9.6。