我在postgres上有一个数据库,其中包含国家/地区特定的表格,即xx_data,其中xx是国家/地区。现在我正在通过sql函数读取这些表,并正在对postgres进行空间计算。
我已经为每个国家/地区创建了函数,即xx_function(param1,param2)和其他重载(每个国家/地区为4个版本)的版本。我有13个表和13 * 4函数。效果很好。
现在,我想根据新要求更改功能,并且必须更新所有52个功能。然后,我想到了将国家/地区作为sql函数的参数并动态创建sql查询。它将减少功能计数到4。我确实创建了一个以country作为参数的功能并运行了查询。新旧功能的执行时间有些相似(我都两次查询了多次),但是新功能的查询计划成本比旧功能高出很多倍。
我做了一些阅读,发现开销与执行时间没有直接关系(意味着更高的查询开销并不总是意味着更长的执行时间)。
我的问题是动态查询执行肯定会降低性能,还是我应该尝试进行负载测试并决定结果。新功能如何与查询计划混淆。任何其他解决此问题的建议将不胜感激。
新功能如下所示。 (旧功能没有国家/地区参数,而是使用国家/地区名称对查询进行硬编码,并且每个国家/地区都有自己的功能。)
CREATE OR REPLACE FUNCTION dummy.new_function(longitude double precision, latitude double precision, country varchar)
RETURNS TABLE(output1 boolean, output2 smallint, output3 smallint)
LANGUAGE plpgsql
AS $function$DECLARE
point geometry;
tabname varchar;
BEGIN
point := ST_SetSRID(ST_Point(longitude, latitude), 4326);
tabname := CONCAT('dummy.',country,'data');
RETURN QUERY
execute 'select i.output1, i.output2, i.output3 from (
SELECT a.output1, a.output2, ST_Value(rast, $1)::smallint as output3 FROM ' || tabname || ' a WHERE
ST_Intersects(rast, $1)) i
where i.output3 > 0' using point;
END $function$