函数

时间:2016-11-08 08:46:46

标签: postgresql postgresql-performance plv8

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

0 个答案:

没有答案
相关问题