postgresql函数执行时间过长

时间:2017-08-31 10:47:48

标签: sql postgresql

以下是我的Postgres功能

CREATE OR REPLACE FUNCTION public.test_me(test_id _int4)
  RETURNS TEXT
AS $BODY$
DECLARE
  tempIds INT[];
  returnValue TEXT := 'Success';
BEGIN

  RAISE NOTICE ' selecting  abc_id for  : %', test_id;

  tempIds := ARRAY ( SELECT DISTINCT abc_id
                     FROM test
                     WHERE test_id IN ( SELECT unnest(test_id)) );

  RAISE NOTICE ' selected abc_id are : %', tempIds;

  RETURN returnValue;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;

我正在执行它

select test_me('{123}'::int[]);

运行需要永远,我发现在执行过程中只打印了第一个通知,它从未到达第二个通知语句。当我在ARRAY方法中运行select查询时,它会快速执行。

编辑1:当我尝试运行像这样的选择查询时

SELECT DISTINCT abc_id 
FROM test
WHERE test_id IN (123)

它的执行速度非常快,因为test_id是一个索引列。

但是当我尝试这样的时候

SELECT DISTINCT abc_id 
FROM test
WHERE test_id IN ( SELECT unnest('{123}'::int[])

由于IN子句内部不需要查询,在test_id列上使用顺序扫描并花费大量时间来运行,所花费了大量时间。

因此,主要罪魁祸首是unnest IN条款内的{{1}}。

在带索引搜索的in子句中使用数组的任何替代?

1 个答案:

答案 0 :(得分:1)

根据a_horse_with_no_name建议而不是使用<{p}} unnest内的IN

test_id = ANY( test_id )

解决了问题!