0

我正在尝试提高 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。

4

0 回答 0