以下是我的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子句中使用数组的任何替代?